如何使用WPF绑定进行设计
我有一个“ticket”列表,它们都来自抽象类如何使用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
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;
}