c# - MVVM - 绑定(bind)到聚合属性

标签 c# wpf mvvm propertychanged

我有以下 View 模型:

public class ViewModel: INotifyPropertyChanged
{
    public ObservableCollection<Item> Items { get; set; }
    ...
}
public class Item: INotifyPropertyChanged
{
    public SubItem A { get; set; }
    public SubItem B { get; set; }
    ...
}
public class SubItem: INotifyPropertyChanged
{
    public bool Valid { get; set; }
    ...
}

xml:
<ListBox ItemsSource="{Binding Items}" ..>

如果我想显示文字 "Valid item"如果两者都是 A.ValidB.Validtrue , 然后:
  • 我可以通过在 View 中添加逻辑(项目数据模板)来做到这一点,例如使用可见性和额外的容器:
    <Grid Visibility="{Binding A.Valid}" Converter=...>
        <TextBlock Text="Valid item" Visibility="{Binding B.Valid}" Converter=... \>
    </Grid>
    
  • 或者我可以向项目 View 模型添加一个新属性:
    public class Item: INotifyPropertyChanged
    {
        public bool Valid => A.Valid && B.Valid; // bind to this
        ...
    }
    

    问题是 SubItem 中的任何一个的通知不会更新 View 。

  • 在 (1) 的情况下,绑定(bind)将订阅 PropertyChanged事件:Item和相应的SubItem .在 (2) 的情况下,绑定(bind)只知道 Item.Valid属性(property),所以我必须做类似的事情:
    public class Item: INotifyPropertyChanged
    {
        SubItem _a;
        public SubItem A
        {
            get { return _a; }
            set
            {
                _a.PropertyChanged -= bla;
                _a = value;
                _a.PropertyChanged += bla;
                OnPropertyChanged(nameof(A));
                OnPropertyChanged(nameof(Valid));
            }
        }
        void bla(object sender, PropertyChangedEventArgs e) =>
            OnPropertyChanged(nameof(Valid));
        ...
    }
    

    这太可怕了。所以我更喜欢(1)(有时使用数据触发器,但这无关紧要)。

    是否有其他选项可以实际拥有 viewmodel 属性 (2) 但没有麻烦?

    最佳答案

    在这种特殊情况下,数据绑定(bind)方法似乎最简单。这样,您就可以依靠 WPF 的数据绑定(bind)机制为您处理事件订阅,而不必通过代码手动完成。

    我知道的唯一其他处理方法是使用某种中介对象。当Valid SubItem 的属性(property)发生了变化,您会发出一条消息,表明这已发生。您的 Item订阅此消息的类通过检查 A 的当前有效状态来处理它和 B , 然后设置自己的 Valid相应的属性(property)。

    然而,这种方法并非没有其自身的缺陷。一方面,您需要将中介对象注入(inject)到您的 ViewModel 对象中。还有你的Item对象需要在适当的时间订阅和取消订阅相关消息(通常在对象创建和销毁时)。所有这些管道虽然仍然比直接处理属性更改事件更容易,但比仅使用数据触发器和依赖 WPF 的绑定(bind)机制 IMO 更困难。

    关于c# - MVVM - 绑定(bind)到聚合属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48930678/

    相关文章:

    c# - WPF 全局异常处理程序

    wpf - 如何将右键单击上下文菜单添加到 WPF 4 DataGrid 的列标题?

    javascript - 是否有 Angular 的事件发布/订阅框架?

    mvvm - 使用 Mvvm-light(oobe)+MEF 的 Silverlight 导航?

    c# - 如何使用最小起订量模拟 Controller.User

    c# - 使用图形 API 添加 MS Teams 网站选项卡错误

    c# - C# 中的惰性字典属性

    c# - 更新/插入信息时出错

    c# - 当按下按钮或按键时,如何在AvalonDock中从一个选项卡转到另一个选项卡?

    .net - MonoTouch 和 MonoDroid 中的 PortableDLL