我碰到了其他关于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
创建一个包含许多不同具体类的对象的模板,这些对象都是从一个常见的抽象基类派生的,那么最好的选择是什么?这些属性全部在抽象基类中定义。 最佳答案
我不知道这是否仍然有意义,但我只是想知道同一件事。
您可以为Abstract类型创建一个DataTemplate。
这是一个创建者的测试人员:
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>
关于c# - 在DataTemplates中使用抽象类作为DataType,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22196242/