首页 文章

从DataTemplateSelector显式刷新DataTemplate?

提问于
浏览
16

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

谢谢

4 回答

  • 18

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

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

    Here's some brief discussion of selectors vs. triggers,虽然情况略有不同 .

  • 8

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

    var currentSelector = MyContentControl.ContentTemplateSelector;     
    MyContentControl.ContentTemplateSelector = null;
    MyContentControl.ContentTemplateSelector = currentSelector;
    
  • 3

    迟到了,我知道 . =)

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

    MyContentControl.ContentTemplateSelector =
         new MyDataTemplateSelector();
    
  • 9

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

    您也可以尝试在 ContentControl s ContentTemplate 属性上使用 ValueConverter 而不是 DataTemplateSelector .

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

    示例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>
    

相关问题