我有一组类都派生自同一个基类。这些旨在作为测试,可以手动或自动运行。我希望屏幕上的显示因枚举而异。它们是在运行时通过 MEF 读入的,因此想法是第 3 方理论上可以编写可以以不同方式运行的测试程序。我想让它们在 XAML 中的编写方式尽可能简单以避免错误。
我已经设法通过使用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>
哪个有效,但我有许多不同的测试,我可能会看到需要不同的显示方式,从而增加枚举大小,显然我需要创建不同ControlTemplate
的但 DataTemplate 将保持不变,只是对于每个不同的DataType
但这使得每个编写的测试都需要遵循特定的模式才能工作,我想让它更易于实施。那么,有没有办法让它更通用,这样我就可以做类似的事情:
<DataTemplate DataType="{x:Type local:MyTestHandler2}" Automatic="{StaticResource x}" Manual="{StaticResource y}"/>
我假设它需要是一个 DataTemplate 以允许 ContentControl 在我使用 ContentControl 并将其设置为当前测试步骤并让 WPF 魔术为我绘制它的 ViewModel 中工作,但也许还有其他方法?
我看了看,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>
但这不是更少的代码,而且还有代码,而与触发器一起使用的方法没有。