如何使用WPF绑定进行设计

如何使用WPF绑定进行设计,wpf,data-binding,binding,Wpf,Data Binding,Binding,我有一个“ticket”列表,它们都来自抽象类TicketBase public abstract class TicketBase { public DateTime PublishedTime { get; set; } public String TicketType { get; set; } } public class TicketA : TicketBase { public string PropertyA { get; set; } } pub

我有一个“ticket”列表,它们都来自抽象类
TicketBase

public abstract class TicketBase
{
     public DateTime PublishedTime { get; set; }
     public String TicketType { get; set; }
}

public class TicketA : TicketBase
{
     public string PropertyA { get; set; }
}

public class TicketB : TicketBase
{
     public string PropertyB { get; set; }
}
在我的主视图模型中,我查询一个数据库并返回一个
列表Tickets
,按发布时间的升序排序

在我看来,我想要的是:

Property A: <most recent value of PropertyA> 
Property B: <most recent value of PropertyB>
在这些属性的设置器中,只需对
Tickets
集合执行linq查询,该集合将获取最顶层的ticket,其中TicketType是相关类型,并获取相应的属性

是否有一种方法可以作为绑定的一部分传入TicketType,或者需要在每个setter方法中硬编码该类型


另外,这是这种绑定方式的最佳方法吗?有没有更好的方法使用我不熟悉的WPF绑定的某些功能?

您的基类不应该依赖于从它派生的任何子类,因此请删除TicketType并使用is操作符来确定TicketBase实例的确切类型。将票证加载到票证集合中,并使用XAML中定义的常规数据绑定从视图中访问它们。下面的示例代码向您展示了如何编写使用linq的属性

另一种方法是使用值转换器和数据绑定到票据。将类型和属性名称作为参数传递,并在值转换器中使用反射返回正确的属性值

public class VM
{
    public VM()
    {
        Tickets = DB.LoadTicketsSorted();    
    }

    public string LatestPropertyA { get { return Tickets.Where(t => t is TicketA).Select(t => (t as TicketA).PropertyA).FirstOrDefault(); } }
    public string LatestPropertyB { get { return Tickets.Where(t => t is TicketB).Select(t => (t as TicketB).PropertyB).FirstOrDefault(); } }

    private List<TicketBase> Tickets;

}
公共类虚拟机
{
公共虚拟机()
{
Tickets=DB.loadticketsorted();
}
公共字符串LatestPropertyA{get{返回票证。其中(t=>t是TicketA)。选择(t=>(t是TicketA.PropertyA)。FirstOrDefault();}}
公共字符串LatestPropertyB{get{return Tickets.Where(t=>t是TicketB)。选择(t=>(t是TicketB.PropertyB)。FirstOrDefault();}
私人名单门票;
}

不是对答案有效性的评论,而是对获取者的替代方案。这将是使用内置Linq筛选器
of type
并减少子句数量的一个很好的例子:
Tickets.OfType().FirstOrDefault().PropertyA
然后,如果
FirstOrDefault
返回null,您将收到一个NullReferenceException。
public class VM
{
    public VM()
    {
        Tickets = DB.LoadTicketsSorted();    
    }

    public string LatestPropertyA { get { return Tickets.Where(t => t is TicketA).Select(t => (t as TicketA).PropertyA).FirstOrDefault(); } }
    public string LatestPropertyB { get { return Tickets.Where(t => t is TicketB).Select(t => (t as TicketB).PropertyB).FirstOrDefault(); } }

    private List<TicketBase> Tickets;

}