在wpf中显示继承对象的最佳方法是什么?

时间:2009-04-10 19:48:20

标签: c# wpf

让我说我有这个:

public class Result 
{
   public bool Success { get; set; }
   public string Description { get; set; }
}

然后我想添加另一个级别,如:

public class AssertionFailedResult : Result
{
  public string Expected { get; set; }
  public string Actual { get; set; }
}

在WPF中,我如何以一种方式显示简单的结果,并且断言失败的结果是另一种方式?我想基本上根据类型创建一个模板。

2 个答案:

答案 0 :(得分:2)

如果在资源字典中创建DataTemplate并设置DataType属性,但不设置x:Key属性,框架将根据对象的运行时类型将DataTemplate与对象相关联。无论好坏,继承都没有效果。换句话说,即使没有具有DataType为“AssertionFailedResult”的模板,框架也将“AssertionFailedResult”类型的对象绑定到模板中DataType是“结果”。

编辑:抱歉,我倒退了。 DataTemplates do 具有“多态”行为。样式没有。在任何情况下,框架都应该使用更具体的DataType绑定到DataTemplate。

答案 1 :(得分:0)

我接受了丹尼尔的回答并做了一个例子。我认为发布代码可能会有所帮助:

<Window x:Class="SampleWpfApplication.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:SampleWpfApplication="clr-namespace:SampleWpfApplication">
    <Window.Resources>
        <DataTemplate DataType="{x:Type SampleWpfApplication:Result}">
            <Label>Simple Result</Label>            
        </DataTemplate>
        <DataTemplate DataType="{x:Type SampleWpfApplication:AssertionFailedResult}">
            <Label>Assertion Failed!</Label>
        </DataTemplate>
    </Window.Resources>
    <ContentControl x:Name="contentControl" Content="{Binding Path=Result}" />
</Window>

接下来,作为窗口数据上下文的模型类:

public class Model
{
    public Result Result { get; set; }
}

在MainWindow中,我按如下方式设置DataContext:

DataContext = new Model()
                  {
                      Result = new AssertionFailedResult()
                                   {
                                       Success = false,
                                       Description = "Assertion failed",
                                       Expected = "1",
                                       Actual = "1"
                                   }
                  };

因此,使用DataTemplate,wpf知道如何在没有任何额外指示的情况下渲染控件。再次感谢,丹尼尔。