让我说我有这个:
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中,我如何以一种方式显示简单的结果,并且断言失败的结果是另一种方式?我想基本上根据类型创建一个模板。
答案 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知道如何在没有任何额外指示的情况下渲染控件。再次感谢,丹尼尔。