从DataTemplateSelector显式刷新DataTemplate?

Shi*_*mmy 18 wpf xaml datatemplate contentcontrol datatemplateselector

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

谢谢

Jen*_*ens 19

迟到了,我知道.=)

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

MyContentControl.ContentTemplateSelector =
     new MyDataTemplateSelector();
Run Code Online (Sandbox Code Playgroud)


ito*_*son 10

我不知道有任何(非kludgy)方法这样做:当WPF需要选择模板时调用DataTemplateSelector,就WPF而言,这是一次性的决定.(你可以通过让WPF认为内容已经改变来克服它,例如通过将内容设置为null然后再返回 - 我认为这样可行但是没有测试它 - 但这非常难看!)如果有一个很好的方法,我也有兴趣知道!

但是,改变内容如何显示的另一种方式更新响应数据的变化,那就是通过触发器.您可以使用集合中的DataTriggers DataTemplate.Triggers显示和隐藏元素,具体取决于内容数据.要更改整个显示,您可以在网格中设置两个渲染,并使用触发器控制哪个可见.您甚至可以将数据模板设置为ContentControl,并使用触发器来更改ContentTemplate.当然,这取决于将模板更改为可绑定属性的标准,但并非总是如此.

这里有一些关于选择器与触发器的简短讨论,尽管情况略有不同.


小智 9

我想我甚至晚些时候参加聚会,但是对于一个可以帮助某人的不同想法......

您也可以尝试使用ValueConverterContentControl小号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();
    }
}
Run Code Online (Sandbox Code Playgroud)

示例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>
Run Code Online (Sandbox Code Playgroud)


Gol*_*k84 5

与Jens答案类似,您可以使用的现有实例来代替创建新实例DataTemplateSelector

var currentSelector = MyContentControl.ContentTemplateSelector;     
MyContentControl.ContentTemplateSelector = null;
MyContentControl.ContentTemplateSelector = currentSelector;
Run Code Online (Sandbox Code Playgroud)