【问题标题】:Binding Linq expression to a Xaml control property with MVVM使用 MVVM 将 Linq 表达式绑定到 Xaml 控件属性
【发布时间】:2017-05-04 19:26:09
【问题描述】:

我正在编写一个 WPF 应用程序,在我看来,我需要显示一个基于 Employee 类的不同属性分组的员工出勤计数的仪表板。我将只有一个可观察的 Employee 对象集合,这些对象将不断更新,进而更新仪表板中的计数器。

由于计数需要分组的属性的动态特性,我们不能使用与需要显示的计数器数量一样多的属性。

所以,如果有办法将 linq 表达式绑定到一个属性,该属性会在每次集合中有一些变化时评估和更新视图,那么任何人都可以提供帮助。

【问题讨论】:

    标签: wpf linq xaml mvvm data-binding


    【解决方案1】:

    您必须自己在视图模型中滚动。

    ObservableCollection<Employee> 一个CollectionChanged 处理程序。在该处理程序中,您希望为每个新添加的Employee 提供一个PropertyChanged 处理程序,并从集合中删除的任何Employee 中删除该PropertyChanged 处理程序。所以两个处理程序:

    void Employees_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    
    void Employee_PropertyChanged(object sender, PropertyChangedEventArgs e)
    

    现在,每当集合获取或丢失项目时,您都会收到通知,并且每当集合中的项目属性更改其值时,您都会收到另一个通知。

    现在编写一个方法来更新您的聚合、组等。叫它UpdateCounters()UpdateCounters() 进行 LINQ 处理并将结果放入带有私有设置器的视图模型属性中。在集合的 CollectionChanged 处理程序和员工的 PropertyChanged 处理程序中调用 UpdateCounters()。如果您只关心 Employee 的某些属性,则通过让Employee_PropertyChanged 仅在适当的属性更改时调用UpdateCounters() 来节省一些周期。

    【讨论】:

    • 谢谢,唯一的问题是,我将无法在 viewmodel bcoz 中定义道具,计数器的数量是基于 emp 属性的动态的..假设有属于我公司的 3 个部门的 emp需要 3 个计数器,然后如果它们属于 4 个不同的名称,则每个名称划分组合需要 3*4 =12 个计数器。为此,我需要使用项目控制重复计数器,因此我无法为 vm 中的每个计数器定义 prop,并且尝试查看是否可以在 xaml 中为每个计数器绑定一个长 exp 跨度>
    • @KNara 所以将表达式的结果放在 ObservableCollection 中并显示在 ItemsControl 中。这对我来说听起来不错。您不能将 LINQ 放在一个绑定中,如果可以的话,那将不那么灵活。
    • 在这种情况下,我如何更新任何更改或如何 raise.propertychanged。我不知道 counters 集合的哪个属性项需要更新。我不喜欢使用 if 条件来更新特定属性的想法,因为我需要在 4 个属性组合上显示计数器,所以基本上我在想,如果我可以为每个计数器绑定一个表达式,我会为所有计数器引发 propertychange 事件,它们'会重新评估 exp 自己以更新新值....如果理解错误,请纠正我
    • 如果它们的值发生变化,计数器结果对象应该引发 PropertyChanged。你不能绑定表达式。在这里睡觉。我们将在(我的)早上解决这个问题。这根本不是一个难题,不要出汗。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多