DataTemplateSelector から DataTemplate を明示的に更新しますか?
-
21-09-2019 - |
質問
ContentControl.DataTemplateSelector を希望するものに設定しました。
コマンドなどに従って、ContentControl を呼び出して、xaml またはコードのいずれかでセレクターからテンプレートを再選択する必要があります。
感謝
解決
これを行うための(難しくない)方法は知りません。DataTemplateSelector は、WPF がテンプレートを選択する必要があるときに呼び出されます。これは、WPF に関する限り 1 回限りの決定です。(コンテンツが変更されたと WPF に認識させることで、それをごまかすことができます。コンテンツを null に設定してから元に戻すという方法です。これはうまくいくと思いますが、まだテストしていません。しかし、これはかなり醜いです!) これを行うための良い方法があれば、私も知りたいと思っています。
ただし、コンテンツの表示方法を変更する別の方法があります。 する データの変更に応じてトリガーを介して更新されます。DataTriggers を使用できます。 DataTemplate.Triggers
コレクションを使用して、コンテンツ データに応じて要素を表示または非表示にします。表示全体を変更するには、たとえば次のようにします。グリッド内に 2 つのレンダリングを設定し、トリガーを使用してどちらを表示するかを制御します。データ テンプレートを ContentControl にして、トリガーを使用して ContentTemplate を変更することもできます。もちろん、これはバインド可能なプロパティであるテンプレートを変更するための基準によって異なりますが、常にそうであるとは限りません。
ここでは、セレクターとセレクターについて簡単に説明します。トリガー, 、文脈は少し異なりますが。
他のヒント
後期パーティーに、私が知っています。 =)
この問題に直面したとき、、私はそれが最も簡単な明示のような新しいTemplateSelectorを設定することが分かっ
MyContentControl.ContentTemplateSelector =
new MyDataTemplateSelector();
私はパーティーにも、後でだと思いますが、別のアイデアのために誰か...
を助けるかもしれませんまた、代わりにValueConverter
のContentControl
sのContentTemplate
プロパティに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>
は、新しいインスタンスを作成する代わりに、あなたはDataTemplateSelector
の既存のインスタンスを使用することができます。
var currentSelector = MyContentControl.ContentTemplateSelector;
MyContentControl.ContentTemplateSelector = null;
MyContentControl.ContentTemplateSelector = currentSelector;