1

我有一组类都派生自同一个基类。这些旨在作为测试,可以手动或自动运行。我希望屏幕上的显示因枚举而异。它们是在运行时通过 MEF 读入的,因此想法是第 3 方理论上可以编写可以以不同方式运行的测试程序。我想让它们在 XAML 中的编写方式尽可能简单以避免错误。

我已经设法通过使用ControlTemplatesDataTemplate类似的方法让它工作:

<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>

但这不是更少的代码,而且还有代码,而与触发器一起使用的方法没有。

4

0 回答 0