質問

ContentControl.DataTemplateSelector を希望するものに設定しました。
コマンドなどに従って、ContentControl を呼び出して、xaml またはコードのいずれかでセレクターからテンプレートを再選択する必要があります。

感謝

役に立ちましたか?

解決

これを行うための(難しくない)方法は知りません。DataTemplateSelector は、WPF がテンプレートを選択する必要があるときに呼び出されます。これは、WPF に関する限り 1 回限りの決定です。(コンテンツが変更されたと WPF に認識させることで、それをごまかすことができます。コンテンツを null に設定してから元に戻すという方法です。これはうまくいくと思いますが、まだテストしていません。しかし、これはかなり醜いです!) これを行うための良い方法があれば、私も知りたいと思っています。

ただし、コンテンツの表示方法を変更する別の方法があります。 する データの変更に応じてトリガーを介して更新されます。DataTriggers を使用できます。 DataTemplate.Triggers コレクションを使用して、コンテンツ データに応じて要素を表示または非表示にします。表示全体を変更するには、たとえば次のようにします。グリッド内に 2 つのレンダリングを設定し、トリガーを使用してどちらを表示するかを制御します。データ テンプレートを ContentControl にして、トリガーを使用して ContentTemplate を変更することもできます。もちろん、これはバインド可能なプロパティであるテンプレートを変更するための基準によって異なりますが、常にそうであるとは限りません。

ここでは、セレクターとセレクターについて簡単に説明します。トリガー, 、文脈は少し異なりますが。

他のヒント

後期パーティーに、私が知っています。 =)

この問題に直面したとき、

、私はそれが最も簡単な明示のような新しいTemplateSelectorを設定することが分かっ

MyContentControl.ContentTemplateSelector =
     new MyDataTemplateSelector();

私はパーティーにも、後でだと思いますが、別のアイデアのために誰か...

を助けるかもしれません

また、代わりにValueConverterContentControlsのContentTemplateプロパティにDataTemplateSelectorを使用してみてください可能性があります。

ただ、例えばDataContextのように、バインドにごScreenNumber内のプロパティを持っています。次いでValueConverterDataTemplateに関連付けられ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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top