2014-03-05 47 views
3

我曾經在C#中關於抽象類和DataTemplates的其他StackOverflow問題上做了一些修改,但不知何故,我不明白它的作用。在數據模板中使用抽象類作爲數據類型

代碼如下所示:

public abstract class AbstractParser() { 
    public string Name { get; set; } 
} 

public class ConcreteParser() : AbstractParser { } 

現在,我想用抽象類(對於ListBox,包含ConcreteParser元素,打造一個DataTemplate 不過,我不得到它。 。在DataTemplate工作基於其他職位(例如WPF databinding to interface and not actual object - casting possible?),這應該是可能的:

<DataTemplate DataType="{x:Type local:AbstractParser}" /> 

要制定具體問題:

如果我想爲包含許多不同具體類的對象的ListBox創建模板,這些類都是從一個公共抽象基類派生的,那麼做到這一點最好的選擇是什麼?這些屬性全部在抽象基類中定義。

回答

1

我不知道這是否仍然相關,但我只是想知道同樣的事情。 ,您可以爲抽象類型創建一個DataTemplate。

這裏是一個測試iv'e創建:

CS:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 

    public Base Base 
    { 
     get { return new Child(); } 
    } 

    public List<Base> BaseCollection 
    { 
     get { return new List<Base> { new Child(), new Child(), new Child2(), new Child2() }; } 
    } 
} 

public abstract class Base 
{ 
    public virtual string Name 
    { 
     get { return "I'm a Base class"; }   
    }   
} 

public class Child : Base 
{ 
    public override string Name 
    { 
     get { return "I'm A child"; } 
    } 
} 

public class Child2 : Base 
{ 

} 

XAML:

<Window> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type local:Base}"> 
      <TextBlock Foreground="Red" FontSize="24" Text="{Binding Name}" /> 
     </DataTemplate> 
    </Window.Resources> 

    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition Height="3*"/> 
     </Grid.RowDefinitions> 


     <ContentControl Content="{Binding Base}" HorizontalAlignment="Center" VerticalAlignment="Center" Height="30" Width="100" /> 
     <ItemsControl ItemsSource="{Binding BaseCollection}" Grid.Row="2"/> 

    </Grid> 
</Window> 
相關問題