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

感谢

有帮助吗?

解决方案

我不知道有任何(非笨拙的)方法可以做到这一点:当 WPF 需要选择模板时,将调用 DataTemplateSelector,就 WPF 而言,这是一次性决定。(您可以通过让 WPF 认为内容已更改来拼凑它,例如通过将内容设置为 null,然后再次返回 - 我认为这会起作用,但还没有测试过 - 但这非常丑陋!)如果有一个好的方法可以做到这一点,我也有兴趣知道!

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

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

其他提示

迟到了,我知道了。 =)

当碰到这样的情况,我发现它最简单的明确设置像

新TemplateSelector
MyContentControl.ContentTemplateSelector =
     new MyDataTemplateSelector();

我想我更晚的聚会,但出于不同的想法,可以帮助别人...

您也可以尝试使用ValueConverterContentControls 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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top