【问题标题】:Caliburn Micro, Notify when property in nedsted object is changedCaliburn Micro,在 nedsted 对象中的属性更改时通知
【发布时间】:2019-05-14 11:41:12
【问题描述】:

我正在开发一个用于数据管理的 C# WPF 应用程序。我将 MVVM 模式与 Caliburn Micro 框架一起使用。
我有一个按钮,只有在某个名称为空的文本框不为空时才能按下。


我的问题是,当我在文本框中输入文本时,CanSaveSelection 不会收到通知,因此不会检查它是否为空。

public class MainWorkspaceViewModel : PropertyChangedBase
{
    private Car _myCar;
    public Car MyCar
    {
        get { return _myCar; }
        set
        {
            _myCar = value;
            NotifyOfPropertyChange(() => CanSaveSelection);
        }
    }

    public void SaveSelection()
    {
        //Do something
    }

    public bool CanSaveSelection
    {
        get
        {
            bool result = true;

            if (String.IsNullOrWhiteSpace(MyCar.Manufacturer.Name))
            {
                result = false;
            }
            return result;
        }
    }
}

对象:

public class Car : PropertyChangedBase
{
    public Manufacturer Manufacturer { get; set; }
}

public class Manufacturer : PropertyChangedBase
{
    public String Name { get; set; }
}

有没有办法让 NotifyOfPropertyChange 认为对象“冒泡”? 我认为另一种方法是使用事件聚合器,但我对此知之甚少。

【问题讨论】:

  • “特定文本框”绑定的源属性在哪里定义?
  • @mm8 文本框绑定的属性是 Manufacurer 类的 Name 属性。所以在这种情况下,绑定路径将是: Path = MyCar.Manufacturer.Name
  • Manufacturer 类是否实现了INotifyPropertyChanged 接口?
  • @mm8 我看到我在我的问题中忘记了一些东西,我编辑了它。是的,他们确实间接认为 PropertyChangedBase 基类。
  • 如果您可以忍受该按钮仍处于启用状态,则可以删除 canSave。在 Save 中,只需检查有一个 Name 并从方法中返回 f 没有。或者您可以绑定一个命令,该命令将根据用户输入重新评估 canexecute。也许 Caliburn Micro 不适合您的项目要求。

标签: c# wpf data-structures data-binding caliburn.micro


【解决方案1】:

您可以在视图模型中处理ManufacturerPropertyChanged 事件:

private Car _myCar;
public Car MyCar
{
    get { return _myCar; }
    set
    {
        if (_myCar != null && _myCar.Manufacturer != null)
            _myCar.Manufacturer.PropertyChanged -= OnManufacturerPropertyChanged;
        _myCar = value;
        NotifyOfPropertyChange(() => CanSaveSelection);
        if (_myCar != null && _myCar.Manufacturer != null)
            _myCar.Manufacturer.PropertyChanged += OnManufacturerPropertyChanged;
    }
}

private void OnManufacturerPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    NotifyOfPropertyChange(nameof(CanSaveSelection));
}

【讨论】:

  • 感谢您的回答,但是当我在 Car 中有多个带有子属性的属性时,这不是大量的代码吗?假设我还有 10 个文本框,每个文本框都绑定到 Car 的不同属性中的属性。那么我不需要这段代码吗?
  • 您显然需要订阅每个引发PropertyChanged 事件的对象。您还应该如何收到通知?
  • 有没有一种方法可以在一个“OnNeededPropertyChanged()”方法中捕获所有来自所需属性的 PropertyChanged 事件?
  • 如果您的意思是这样,您可以对所有对象使用相同的事件处理程序。
猜你喜欢
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多