我已经解决了有关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
创建模板,这些对象都是从一个公共抽象基类派生的,那么最好的选择是什么?这些属性都在抽象基类中定义。
答案 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>