wpf - 在 WPF DataTemplate 中引用控件

标签 wpf xaml listbox datatemplate code-behind

在我为教堂设计的 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/

相关文章:

c# - 在 MVVM 世界中更改 CollectionViewSource 源

wpf - 如何突出显示列表框中的匹配子字符串?

C++ Nana 如何从全局列表框 * 指针访问列表框内索引 0 上的按钮?

WPF 在其他 ControlTemplates 中重用模板

c# - 丑陋的线条和边框渲染

c# - 如何将组合框选择更改值与列表框项绑定(bind)?

c# - 滚动 WPF TabItems(不是整个 TabControl)

WPF ListBox 在使用 ICommand 删除后选择下一项

c# - 如何使 tekla 控件在 WPF 中工作?

C++ Winapi Owner绘制的列表框动画