【问题标题】:Bind one property to another and chain/fire OnPropertyChanged将一个属性绑定到另一个属性并链接/触发 OnPropertyChanged
【发布时间】:2015-07-12 19:24:05
【问题描述】:

我在 WPF 应用程序中从 XAML 绑定到属性,但此查询是关于在另一个类/对象中引发另一个类属性时引发一个类属性的“PropertyChanged”事件。一个用例是组合框 ItemsSource 绑定到属性(下面我的简化示例中的 PropB),并且该属性返回基于其他属性的集合(下面的 PropA)。当 A 类中的 PropA 发生变化时,B 类中的 PropB 需要引发 PropertyChanged,但 A 类没有引用 B 类。

当另一个对象中的属性发生更改时,是否存在让 INotifyPropertyChanged 对象的属性引发“OnPropertyChanged”的现有方法或框架?

下面是我想使用虚构的“通知”属性作为绑定路径的示例:

public class A : NotifyPropertyChanged
{
    string m_PropA;
    public string PropA
    {
        get { return m_PropA; }
        set
        {
            if (m_PropA != value)
            {
                m_PropA = value;
                OnPropertyChanged("PropA");
            }
        }
    }
}

public class B : NotifyPropertyChanged
{
    public A ARef { get; private set; }

    string m_PropB;
    [Notify("ARef.PropA")]
    public string PropB
    {
        get { return ARef.PropA; }
    }
}

理想情况下,该属性会为属性路径(ARef 和 PropA)中的每个属性创建一个绑定,并且当它们中的任何一个发生更改时,它会在类 B 上调用 OnPropertyChanged,并将“PropB”作为 propertyName 参数传递。我假设 ARef 属性在更改时也需要引发事件,但如果不这样做会很好。

我猜这需要一些反射和弱事件监听器。希望存在我可以使用的东西。抱歉,如果之前已经回答过这个问题。

【问题讨论】:

  • 如果存在“ViewModelA”和“ViewModelB”之类的东西,您可以使用Mediator 模式将消息从一个发送到另一个。网络上有几篇关于该主题的文章,例如:marlongrech.wordpress.com/2009/04/16/…
  • 谢谢。我的时间有点短,所以在进一步阅读之前我会问 - 当 B 引用 A 时,这是否需要 A 向 B 发送消息?在我上面的示例中,A 可能位于由包含 B 的不同程序集引用的程序集中,因此 A 无法向 B 发送消息(即它不知道 B)。希望这个问题有意义。
  • Mediator 是关于对象向“它可能关心的人”发送消息,通信对象不需要相互“了解”,不需要从“A”到“B”的引用,反之亦然- 反之

标签: c# inotifypropertychanged


【解决方案1】:

提示1(绑定)

  • 将您的绑定从 Path=PropB 更改为 Path=ARef.PropA 并将 OnPropertyChanged 添加到 B 类的 ARef 设置器中。
  • 在这种情况下,当您更改 B 类中的 ARef 属性或 A 类中的 PropA 时,值将被更改

提示2(事件链)

  • 在 A 的设置器中(在 B 中)将事件处理程序添加到 A 类的 PropertyChanged 事件。n 处理程序,当 arg 包含 PropA 时引发 PropB 的 PropertyChangedEvent。
  • 手动事件触发是忘记某些事情并让您的应用程序混乱的好方法

【讨论】:

  • 感谢您的回答。 Tip1 在我的实际案例中不起作用,因为 PropB 可能会根据多个其他属性派生一个值,而不是直接返回 ARef.PropA 的值。 Tip2 听起来像是事件链的手动版本,我宁愿以更清洁、更安全的方式处理弱事件。
  • 如果 PropB 基于多个其他属性——并且它们有 PropertyChangedEvent——你可以使用 Multibinding 和 MultiValueConverter。
  • 对不起,我应该说“源自”。 PropB 根据其他属性的状态生成一个值。例如,PropB 可能会返回一个数据库表名列表,而 PropA 可能是某些数据库连接详细信息(如服务器)的一部分。任何绑定到 PropB 的东西都需要在 PropA 或 RefA 更改时重新查询(包括在没有 UI 的情况下运行时使用 PropertyChanged 事件的模型中的其他对象)。
猜你喜欢
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多