在我为教堂设计的 WPF 页面中,我有两个 ListBox 控件绑定(bind)到两个 Linq-to-Entities 查询的结果:第一个列表框/查询包含所有尚未认捐的人今年,第二个列表框/查询包含所有已做出 promise 的人(及其相关 promise )。具体来说:
var familiesWithNoPledges = from family in entities.Family.Include("Pledge")
where !family.Pledge.Where(p => p.PledgeYearID == pledgeYear).Any()
select family;
var familiesWithPledges = from family in entities.Family
join pledge in entities.Pledge.Include("PledgeFrequency").Where(p => p.PledgeYearID == pledgeYear) on family equals pledge.Family
select new { family, pledge };
当应用程序的用户从第一个列表框中选择一个家庭时,列表框项目会稍微展开以显示 promise 字段,以便轻松将 promise 详细信息添加到第二个列表框中。它看起来像这样:
http://wouldbetheologian.com/images/PledgeManager.jpg (Offsite Image)
底层数据库(除其他外)有一个“Family”表,与“Pledge”表具有一对多关系。当用户单击“添加 Pledge”按钮时,我想创建新的 Pledge 实例,将其保存到数据库,然后刷新这两个控件。
但我不知道该怎么做。如果我尝试在代码隐藏中执行此操作,“添加 promise ”按钮(的 n 个实例)的事件处理程序似乎无法引用有问题的控件;在 XAML 中,如果我尝试将 ListBoxItem DataTemplate 控件绑定(bind)到 Family.Pledge(或 Family.Pledge.FirstOrDefault())字段,则当我在 Add 的事件处理程序中查看当前 Family 对象时,这些字段仍然为空 promise 按钮。
对于如何解决这个问题有什么想法吗?或者我应该考虑一下更好的 UI 模型吗?
提前致谢。
最佳答案
最简单的方法是让代表 ListBox ItemsSource 中项目的类拥有您在 DataTemplate 中引用的所有字段。然后,在按钮处理程序中,您可以使用按钮的数据上下文访问新的 promise 信息。
private void AddPledge_Click(object sender, RoutedEventArgs e)
{
Button b = sender as Button;
PotentialPledge p = b.DataContext as PotentialPledge;
//do stuff with pledge
}
可能有一种方法可以做到这一点,而不需要模板化字段成为组成 ListBox 的 ItemsSource 的类的一部分(我自己刚刚学习 WPF),但这可行。如果这没有帮助,我会稍后再回顾(现在去工作)。
无论如何,为您的教堂制作应用程序真是太棒了,它看起来相当不错。
关于wpf - 在 WPF DataTemplate 中引用控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/605306/