既然你要根据绑定的值更改模板,你可以使用一个DataTrigger
确定的ListBoxItem
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="ContentTemplate" Value="{StaticResource DefaultTemplate}"/>
<Style.Triggers>
<DataTrigger Property="{Binding SomeProperty}" Value="A">
<Setter Property="ContentTemplate" Value="{StaticResource TemplateA}"/>
</DataTrigger>
</Style.Triggers>
</Style>
我找到ContentTemplate
这比使用DataTemplateSelector
,因为它得到重新评估,如果更好绑定属性会发生变化,而DataTemplateSelector
不会。
如果要根据对象类型更改模板,可以使用隐式DataTemplates
。这些是DataTemplates
,它们定义了DataType
,但没有x:Key
,它们将在WPF尝试绘制指定类型的对象时随时使用。
例如,如果您曾在定义这个模板您<X.Resources>
地方
<DataTemplate DataType="{x:Type models:ActionA}">
<views:ActionAView />
</DataTemplate>
,那么你可以直接插入你的模型对象到用户界面和WPF将使用指定
<ContentControl Content="{Binding SomeIActionObject}" />
<ItemsControl ItemsSource="{Binding CollectionOfIActionObjects}" />
模板绘制
更新
您提到您将允许用户创建与开始使用MEF导入其他模板模块,所以在这种情况下,你可能会更好使用的IValueConverter是查找中Application.Resources
例如匹配的模板,如果绑定的值等于"A"
,那么转换器可能搜索Application.Resources
名为"TemplateA"
模板,并将其返回结合
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="ContentTemplate"
Value="{Binding SomeProperty,
Converter={StaticResource MyTemplateConverter}}"/>
</Style>
你还好吗使用一些其他辅助类或类似的 - 只要你查看视图模型只是一个 - 和单一属性 - 或多个属性在您的虚拟机中。有很多解决方案,稍后我会尝试写点东西 - 我只需要知道目标是什么。例如。看到这个'flags'解决方案(解决方案2)http://stackoverflow.com/questions/15550344/genrating-views-usercontrols-using-contentcontrol/15550477#15550477 - (你可以映射这不仅仅是两个'选择等) - 但是我经常使用更好的方法。 – NSGaga 2013-03-26 18:59:21
我没有使用助手/转换器/等问题。我可以使用一个解决方案,它要求我在设计时在xaml中列出所有可能的选择,因为那时我不会知道它们。我想最简单的方法来演示我需要的是为DataTemplate添加一个假设属性,如下所示:' '其中View是ListBox的DataTemplate中的一个属性。 –
2013-03-26 19:05:59
可能是一个包含视图名称的字符串。我认为,我可以安排所有的观点都在同一个命名空间,即使是动态的。而上面我的意思是“ListBox的DataContext”,但我刚用完编辑时间 – 2013-03-26 19:10:34