C# 为派生类重用DataTemplate
我有一组类,它们都来自同一个基类。这些是测试,可以手动或自动运行。我希望屏幕上的显示根据枚举而有所不同。它们在运行时通过MEF读取,因此第三方理论上可以编写一个可以以不同方式运行的测试过程。我想使它们在XAML中的编写方式尽可能简单,以避免错误 我已经通过使用C# 为派生类重用DataTemplate,c#,wpf,datatemplate,C#,Wpf,Datatemplate,我有一组类,它们都来自同一个基类。这些是测试,可以手动或自动运行。我希望屏幕上的显示根据枚举而有所不同。它们在运行时通过MEF读取,因此第三方理论上可以编写一个可以以不同方式运行的测试过程。我想使它们在XAML中的编写方式尽可能简单,以避免错误 我已经通过使用ControlTemplates和类似于以下内容的DataTemplate实现了这一点: <ControlTemplate x:Key="AutomaticTemplate"> <TextBlock Text="W
ControlTemplates
和类似于以下内容的DataTemplate
实现了这一点:
<ControlTemplate x:Key="AutomaticTemplate">
<TextBlock Text="Weeble"/>
</ControlTemplate>
<ControlTemplate x:Key="ManualTemplate">
<TextBlock Text="Wobble"/>
</ControlTemplate>
<DataTemplate DataType="{x:Type local:MyTestHandler1}">
<Control x:Name="myControl" Template="{StaticResource AutomaticTemplate}"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RunMode}" Value="{x:Static tr:RunType.Manual}">
<Setter TargetName="myControl" Property="Template" Value="{StaticResource ManualTemplate}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
我假设它需要是一个DataTemplate,以允许ContentControl在我的ViewModel中工作,我使用ContentControl并将其设置为当前测试步骤,让WPF magic为我绘制它,但可能有其他方法
我查看了DataTemplateSelector
,但是处理程序在运行时与它的DataTemplates
一起被读入,但是它最终也是XAML
public class RunModeTemplateSelector : DataTemplateSelector
{
public DataTemplate AutomaticTemplate { get; set; }
public DataTemplate ManualTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
RunType runType = ((TestHandler)item).RunMode;
switch(runType)
{
case RunType.Automatic:
return AutomaticTemplate;
case RunType.Manual:
return ManualTemplate;
case RunType.SingleStep:
default:
return AutomaticTemplate;
}
}
使用如下XAML:
<DataTemplate x:Key="AutomaticTemplate">
<TextBlock Text="Weeble"/>
</DataTemplate>
<DataTemplate x:Key="ManualTemplate">
<TextBlock Text="Wobble"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:MyTestHandler}">
<DataTemplate.Resources>
<tr:RunModeTemplateSelector
ManualTemplate="{StaticResource ManualTemplate}"
AutomaticTemplate="{StaticResource AutomaticTemplate}"
x:Key="MyTemplateSelector"/>
</DataTemplate.Resources>
<ContentPresenter ContentTemplateSelector="{StaticResource ResourceKey=MyTemplateSelector}"/>
</DataTemplate>
但是这并不是更少的代码,也有代码隐藏,而触发器使用的方法没有代码。那么
DataTemplateSelector
()呢?然后你可以在XAML中添加新的模板,让你的选择器的切换语句决定你要根据你需要多少个EnUM组合来使用哪个模板?@ VIV我确实考虑过这个问题,并且更新了我的问题来显示我做了什么,但是也碰到了这个问题的症结所在。
<DataTemplate x:Key="AutomaticTemplate">
<TextBlock Text="Weeble"/>
</DataTemplate>
<DataTemplate x:Key="ManualTemplate">
<TextBlock Text="Wobble"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:MyTestHandler}">
<DataTemplate.Resources>
<tr:RunModeTemplateSelector
ManualTemplate="{StaticResource ManualTemplate}"
AutomaticTemplate="{StaticResource AutomaticTemplate}"
x:Key="MyTemplateSelector"/>
</DataTemplate.Resources>
<ContentPresenter ContentTemplateSelector="{StaticResource ResourceKey=MyTemplateSelector}"/>
</DataTemplate>