20

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

感謝

4

4 に答える 4

20

パーティーに遅れて、私は知っています。=)

この問題に直面したとき、新しい TemplateSelector を次のように明示的に設定するのが最も簡単であることがわかりました

MyContentControl.ContentTemplateSelector =
     new MyDataTemplateSelector();
于 2011-06-16T06:57:18.540 に答える
13

私はパーティーにさらに遅れていると思いますが、誰かを助けるかもしれない別のアイデアのために...

ValueConverterの代わりにContentControlsContentTemplateプロパティでを使用することもできますDataTemplateSelector

たとえばDataContext、バインドするプロパティを持っているだけです。ScreenNumber次に、 に関連付けられた がValueConverter返されます。DataTemplateScreenNumber

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>
于 2012-10-04T19:14:23.157 に答える
11

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

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

ここでは、わずかに異なるコンテキストではありますが、セレクターとトリガーの簡単な説明を示します。

于 2010-01-18T21:16:04.590 に答える