20

我将 ContentControl.DataTemplateSelector 设置为我想要的。
我希望根据命令或其他方式调用 ContentControl 以通过 xaml 或代码从选择器中重新选择模板。

谢谢

4

4 回答 4

20

我知道派对迟到了。=)

遇到这个问题时,我发现最简单的方法是显式设置一个新的 TemplateSelector

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

我想我参加派对的时间甚至更晚,但是对于一个可能对某人有所帮助的不同想法......

您也可以尝试ValueConverterContentControlsContentTemplate属性上使用 a 而不是 a DataTemplateSelector

只需在您DataContext的绑定中拥有一个属性,ScreenNumber例如。然后在ValueConverter返回DataTemplate中与关联的ScreenNumber.

示例值转换器:

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 而言,这是一次性的决定。(您可以通过让 WPF 认为内容已更改来混淆它,例如通过将内容设置为 null 然后再返回 - 我认为这可行但尚未测试它 - 但这很丑陋!)如果有一个很好的方法,我也很想知道!

但是,还有另一种方法可以更改内容的显示方式,该方法会根据数据更改进行更新,即通过触发器。您可以使用集合中的 DataTriggersDataTemplate.Triggers来根据内容数据显示和隐藏元素。要更改整个显示,您可以例如在一个网格中设置两个渲染,并使用触发器来控制哪个是可见的。您甚至可以将您的数据模板设为 ContentControl,并使用触发器来更改 ContentTemplate。当然,这取决于将模板更改为可绑定属性的标准,但情况可能并非总是如此。

下面是选择器与触发器的一些简短讨论,尽管上下文略有不同。

于 2010-01-18T21:16:04.590 回答
6

与 Jens 的回答类似,您可以使用现有的实例,而不是创建新的实例DataTemplateSelector

var currentSelector = MyContentControl.ContentTemplateSelector;     
MyContentControl.ContentTemplateSelector = null;
MyContentControl.ContentTemplateSelector = currentSelector;
于 2016-06-15T18:52:29.233 回答