在DataTemplates中使用抽象类作为DataType

时间:2014-03-05 11:20:27

标签: c# wpf abstract-class datatemplate

我已经解决了有关C#中抽象类和DataTemplates的其他StackOverflow问题,但不知怎的,我不能让它工作。

代码如下所示:

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

public class ConcreteParser() : AbstractParser { }

现在,我想使用抽象类创建一个DataTemplate(对于ListBox,包含ConcreteParser的元素。 但是,我没有让它在DataTemplate中工作。基于其他帖子(例如WPF databinding to interface and not actual object - casting possible?),这应该是可能的:

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

制定具体问题:

如果我想为包含许多不同具体类的对象的ListBox创建模板,这些对象都是从一个公共抽象基类派生的,那么最好的选择是什么?这些属性都在抽象基类中定义。

1 个答案:

答案 0 :(得分:1)

我不知道这是否仍然相关,但我只是想知道同样的事情。 您可以为Abstract类型创建DataTemplate。

这是一个测试人员iv&#39;创建:

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>