我将ContentControl.DataTemplateSelector设置为我想要的 .我希望根据命令或其他任何东西,调用ContentControl以通过xaml或代码从选择器重新选择模板 .
谢谢
我不知道任何(非kludgy)方法这样做:当WPF需要选择模板时调用DataTemplateSelector,就WPF而言,这是一次性的决定 . (你可以通过让WPF认为内容已经改变来克服它,例如通过将内容设置为null然后再返回 - 我认为这样可行但是没有测试它 - 但这非常难看!)如果有一个很好的方法,我也有兴趣知道!
但是,还有一种替代方法可以更改内容的显示方式,以便响应数据更改进行更新,即通过触发器 . 您可以在 DataTemplate.Triggers 集合中使用DataTriggers来显示和隐藏元素,具体取决于内容数据 . 要更改整个显示,您可以例如在网格中设置两个渲染,并使用触发器来控制哪个是可见的 . 您甚至可以将数据模板设置为ContentControl,并使用触发器来更改ContentTemplate . 当然,这取决于将模板更改为可绑定属性的标准,但并非总是如此 .
DataTemplate.Triggers
Here's some brief discussion of selectors vs. triggers,虽然情况略有不同 .
与Jens回答类似,您可以使用 DataTemplateSelector 的现有实例,而不是创建新实例 .
DataTemplateSelector
var currentSelector = MyContentControl.ContentTemplateSelector; MyContentControl.ContentTemplateSelector = null; MyContentControl.ContentTemplateSelector = currentSelector;
迟到了,我知道 . =)
遇到这个问题时,我发现最简单的方法是显式设置一个新的TemplateSelector
MyContentControl.ContentTemplateSelector = new MyDataTemplateSelector();
我想我甚至晚些时候参加聚会,但是对于一个可以帮助某人的不同想法......
您也可以尝试在 ContentControl s ContentTemplate 属性上使用 ValueConverter 而不是 DataTemplateSelector .
ContentControl
ContentTemplate
ValueConverter
只需要在 DataContext 中绑定一个属性,例如 ScreenNumber . 然后在 ValueConverter 中返回与 ScreenNumber 关联的 DataTemplate .
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 回答
我不知道任何(非kludgy)方法这样做:当WPF需要选择模板时调用DataTemplateSelector,就WPF而言,这是一次性的决定 . (你可以通过让WPF认为内容已经改变来克服它,例如通过将内容设置为null然后再返回 - 我认为这样可行但是没有测试它 - 但这非常难看!)如果有一个很好的方法,我也有兴趣知道!
但是,还有一种替代方法可以更改内容的显示方式,以便响应数据更改进行更新,即通过触发器 . 您可以在
DataTemplate.Triggers
集合中使用DataTriggers来显示和隐藏元素,具体取决于内容数据 . 要更改整个显示,您可以例如在网格中设置两个渲染,并使用触发器来控制哪个是可见的 . 您甚至可以将数据模板设置为ContentControl,并使用触发器来更改ContentTemplate . 当然,这取决于将模板更改为可绑定属性的标准,但并非总是如此 .Here's some brief discussion of selectors vs. triggers,虽然情况略有不同 .
与Jens回答类似,您可以使用
DataTemplateSelector
的现有实例,而不是创建新实例 .迟到了,我知道 . =)
遇到这个问题时,我发现最简单的方法是显式设置一个新的TemplateSelector
我想我甚至晚些时候参加聚会,但是对于一个可以帮助某人的不同想法......
您也可以尝试在
ContentControl
sContentTemplate
属性上使用ValueConverter
而不是DataTemplateSelector
.只需要在
DataContext
中绑定一个属性,例如ScreenNumber
. 然后在ValueConverter
中返回与ScreenNumber
关联的DataTemplate
.示例ValueConverter:
示例xaml资源: