在我第一次使用WPF尝试时,我走得太远了:
我有一个对象需要不同的DataTemplate,具体取决于其中一个属性。换句话说,if (object.property=="multi")
然后模板应该是一个组合等等。
现在我已经开始了,显然使用DataTemplateSelector来应用所需的模板。并在运行时工作。在设计时vs2008设计师抱怨因为DataTemplateSelector使用Application.Current.MainWindow.FindResource以便找到适当的模板来应用,显然Application.Current在设计时不是我的应用程序,所以资源无法找到,所以设计师抛出一个例外。
鉴于我希望其他人能够更改模板,我真的需要设计时支持。
我的问题有解决方案吗? 我的整个方法是否完全有缺陷?
答案 0 :(得分:1)
您可以为每种模板的模板选择器添加依赖项属性,并在XAML中引用模板:
<local:MyTemplateSelector x:Key="myTemplateSelector"
Template1="{StaticResource tpl1}"
Template2="{StaticResource tpl2}"
/>
或者,只需在后面的代码中实例化并分配模板选择器。
答案 1 :(得分:0)
这只是我的头脑,所以我不确定它是否有效,但是如何使用数据触发器并使用setter分配适当的模板。
像“
<ContentControl>
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding Property}" Value="multi">
<Setter Property="ContentTemplate" Value="{StaticResource templateKey}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
...
</ContentControl>
答案 2 :(得分:0)
我想我已经找到了我的问题的答案(虽然它有自己的问题)。
DataTemplateSelector应具有公共属性来保存可能的模板。当您在XAML中实例化DataTemplateSelector时,您将向其传递相关模板,例如
&lt; TemplateSelector MultiTemplate1 = Template1,MultiTemplate2 = Template2 /&gt;
这实现了设计时支持。另一方面,它要求您在实例化选择器时知道可能的模板是什么,但情况并非总是如此。