2009-04-10 5 views
0

Lets sagen, ich habe dies:Was ist der beste Weg, um ein geerbtes Objekt in WPF anzuzeigen?

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

Dann möchte ich eine weitere Ebene hinzuzufügen, wie folgt aus:

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

In WPF, wie würde ich das einfache Ergebnis einer Art und Weise und die Behauptung gescheitert Ergebnis zeigen ein anderer Weg? Ich möchte grundsätzlich eine Vorlage basierend auf Typ erstellen.

Antwort

2

Wenn Sie ein DataTemplate in einem Ressourcenwörterbuch erstellen und die DataType-Eigenschaft festlegen, aber die Eigenschaft x: Key nicht festlegen, ordnet das Framework DataTemplate Objekten basierend auf dem Laufzeittyp des Objekts zu. Zum Guten oder zum Schlechten hat die Vererbung keine Wirkung. Mit anderen Worten, auch wenn Sie nicht eine Vorlage haben, wo der DataType "AssertionFailedResult" war, würde das Framework nicht Objekte des Typs "AssertionFailedResult" an eine Vorlage binden, wo der Datentyp "Ergebnis" war.

EDIT: Sorry, ich habe es rückwärts. DataTemplates do haben ein "polymorphes" Verhalten. Stile nicht. In jedem Fall sollten die Frameworks an das DataTemplate mit dem spezifischeren DataType gebunden sein.

0

Ich nahm Daniels Antwort und machte ein Beispiel daraus. Ich dachte, die Entsendung Code könnte hilfreich sein:

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

Als nächstes wird eine Modellklasse, die der Datenkontext des Fensters ist:

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

Und in der Mainwindow, ich die Datacontext wie folgt festgelegt:

Also mit dem DataTemplate weiß wpf wie man das Steuerelement ohne zusätzliche Anweisungen meinerseits rendern kann. Nochmals vielen Dank, Daniel.

Verwandte Themen