ContentControl.DataTemplateSelector を目的のものに設定しました。
コマンドなどに従って、ContentControl を呼び出して、xaml またはコードのいずれかでセレクターからテンプレートを再選択します。
感謝
ContentControl.DataTemplateSelector を目的のものに設定しました。
コマンドなどに従って、ContentControl を呼び出して、xaml またはコードのいずれかでセレクターからテンプレートを再選択します。
感謝
パーティーに遅れて、私は知っています。=)
この問題に直面したとき、新しい TemplateSelector を次のように明示的に設定するのが最も簡単であることがわかりました
MyContentControl.ContentTemplateSelector =
new MyDataTemplateSelector();
私はパーティーにさらに遅れていると思いますが、誰かを助けるかもしれない別のアイデアのために...
ValueConverter
の代わりにContentControl
sContentTemplate
プロパティでを使用することもできますDataTemplateSelector
。
たとえばDataContext
、バインドするプロパティを持っているだけです。ScreenNumber
次に、 に関連付けられた がValueConverter
返されます。DataTemplate
ScreenNumber
ValueConverter の例:
public class ValueDataTemplateConverter : IValueConverter
{
public DataTemplate TemplateA { get; set; }
public DataTemplate TemplateB { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is ValueType valueType)
switch (valueType)
{
case ValueType.TypeA:
return TemplateA;
case ValueType.TypeB:
return TemplateB;
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
xaml リソースの例:
<converters:ValueDataTemplateConverter x:Key="ValueDataTemplateConverter">
<converters:ValueDataTemplateConverter.TemplateA>
<DataTemplate>
<TextBox Text="{Binding Value}" />
</DataTemplate>
</converters:ValueDataTemplateConverter.TemplateA>
<converters:ValueDataTemplateConverter.TemplateB>
<DataTemplate>
<CheckBox IsChecked="{Binding Value}" />
</DataTemplate>
</converters:ValueDataTemplateConverter.TemplateB>
</converters:ValueDataTemplateConverter>
私はこれを行う(不親切ではない)方法を知りません.WPFがテンプレートを選択する必要があるときにDataTemplateSelectorが呼び出されます.WPFに関する限り、これは1回限りの決定です. (たとえば、コンテンツを null に設定してからもう一度戻すなど、コンテンツが変更されたと WPF に認識させることで、それをこじ開けることができます。これはうまくいくと思いますが、テストしていませんが、これはかなり醜いです!)これを行うための良い方法は、私も知りたいです!
ただし、データの変更に応じて更新されるコンテンツの表示方法を変更する別の方法があり、それはトリガーを使用することです。コレクションで DataTriggers を使用DataTemplate.Triggers
して、コンテンツ データに応じて要素を表示および非表示にすることができます。表示全体を変更するには、たとえば、グリッドに 2 つのレンダリングを設定し、トリガーを使用してどちらを表示するかを制御できます。データ テンプレートを ContentControl にして、トリガーを使用して ContentTemplate を変更することもできます。もちろん、これはバインド可能なプロパティであるテンプレートを変更するための基準に依存しますが、常にそうであるとは限りません。
ここでは、わずかに異なるコンテキストではありますが、セレクターとトリガーの簡単な説明を示します。