代码之家  ›  专栏  ›  技术社区  ›  Shimmy Weitzhandler 500 - Internal Server Error

是否从DataTemplateSelector显式刷新DataTemplate?

  •  17
  • Shimmy Weitzhandler 500 - Internal Server Error  · 技术社区  · 16 年前

    我将ContentControl.DataTemplateSelector设置为所需的。
    我希望根据命令或其他任何命令,调用ContentControl以通过XAML或代码从选择器中重新选择模板。

    感谢

    4 回复  |  直到 7 年前
        1
  •  9
  •   itowlson    15 年前

    我不知道任何(非Kludgy)方法来实现这一点:当wpf需要选择模板时调用dataTemplateSelector,这对于wpf来说是一次性的决定。(你可以通过让wpf认为内容已经改变,例如将内容设置为空,然后再次返回——我认为这是可行的,但还没有测试过——但是这很难看!)如果有一个好方法来做这件事,我也会有兴趣知道!

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

    Here's some brief discussion of selectors vs. triggers 尽管背景略有不同。

        2
  •  18
  •   Jens    14 年前

    我知道,参加聚会迟到了。=)

    当面对这个问题时,我发现很容易显式地设置一个类似模板选择器的新模板

    MyContentControl.ContentTemplateSelector =
         new MyDataTemplateSelector();
    
        3
  •  8
  •   Peter van Kekem    7 年前

    我想我会更晚一点去参加聚会,但是为了另一个能帮助别人的想法…

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

    在你的房子里 DataContext 绑定,像 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>
    
        4
  •  3
  •   Goldorak84 SeahawksRdaBest    9 年前

    与jens answer类似,您可以使用 DataTemplateSelector .

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