Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为派生类重用DataTemplate_C#_Wpf_Datatemplate - Fatal编程技术网

C# 为派生类重用DataTemplate

C# 为派生类重用DataTemplate,c#,wpf,datatemplate,C#,Wpf,Datatemplate,我有一组类,它们都来自同一个基类。这些是测试,可以手动或自动运行。我希望屏幕上的显示根据枚举而有所不同。它们在运行时通过MEF读取,因此第三方理论上可以编写一个可以以不同方式运行的测试过程。我想使它们在XAML中的编写方式尽可能简单,以避免错误 我已经通过使用ControlTemplates和类似于以下内容的DataTemplate实现了这一点: <ControlTemplate x:Key="AutomaticTemplate"> <TextBlock Text="W

我有一组类,它们都来自同一个基类。这些是测试,可以手动或自动运行。我希望屏幕上的显示根据枚举而有所不同。它们在运行时通过MEF读取,因此第三方理论上可以编写一个可以以不同方式运行的测试过程。我想使它们在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>
我假设它需要是一个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>