如何在运行时管理事件订阅

时间:2015-01-07 18:46:27

标签: c#

好的感谢您的意见和建议我已经修改了我的问题,以更准确地反映我的需求。

我正在阅读INOTifyPropertyChanged如何在WPF中工作,这样我就可以在另一种技术中实现一种对它的混淆,我的UI会在UI上跟踪的属性发生变化时通知我(Unity 4.6)。

基本上我需要的是当代码中的属性发生变化时,XAML如何管理INotifyPropertyChanged的数据绑定和事件

我有一个Unity项目,我需要知道如何设置我的UI类来订阅事件,告诉UI对UI上显示的属性进行了更改,并使所有实例都在与要更新的属性关联的UI上的文本。我需要在运行时订阅事件,因为当我在编译时订阅它们时,当我在屏幕上显示属性时,当该对象不为null时,我从空对象获取空引用异常。即一个具有属性Property1的MyObject类,我想在其中显示

var MyGameObject1 = new MyObject();
MyGameObject1.Property1 = "Bob";

我的二传手中有哪些

public string Property1
{
get
{
return _property1;
}
set
{
_property1 = value;
NotifyPropertyChanged("Property1");
}
}
public event EventHandler<UnityPropertyChangedEventArgs>  PropertyChanged;

private void NotifyPropertyChanged(string propertyChanged)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new UnityPropertyChangedEventArgs(propertyChanged));
    }
}

如何让我的UI在运行时管理我通过文本显示的UI元素,并在其值发生变化时接收从其setter触发的事件。

2 个答案:

答案 0 :(得分:1)

由于您希望在基于Unity的环境中实现类似的功能,因此您可能最好不要再提出具体解决问题的问题。那就是说,回答你的具体问题:

  1. &#34;已发生订阅PropertyChanged以注册更改的内容。&#34;
  2. WPF订阅它。

    1. &#34;它在哪里订阅它。如果在运行时,如何?&#34;
    2. 这取决于具体情况。在某些情况下,XAML编译器可以生成订阅该事件的代码。在其他情况下,这可以在运行时完成,这可以通过检查对象是否实现INotifyPropertyChanged并订阅事件来完成。

      1. &#34;这是通过INotifyPropertyChanged自动完成的。&#34;
      2. WPF自动处理该接口提供的事件,这是自动的。界面本身不会导致这种情况本身自动发生。即在某些其他情况下,简单地实现该接口不会导致相同的事情发生。

        1. &#34;接下来,它是如何知道UI上的WHICH属性更新的,因为它只知道PropertyName(据我所知),当事件被触发时,订阅该事件的任何东西都会被接收它&#34;
        2. 在基于XAML的应用程序中,XAML本身中存在引用特定属性的信息,将该属性绑定到某个UI元素(例如元素的属性,其样式等)。您没有显示任何XAML,因此无法在示例中具体说明它的工作原理。

答案 1 :(得分:1)

  

有一个null对象,我想在设置时在我的UI“SelectedObject.Property1”上显示一个属性。

只需使用观察者模式 - 就像那样简单。将“property updated”事件添加到源模型类,并让UI类订阅该事件。

  

已发生订阅PropertyChanged以注册更改的内容。

如果查看UI绑定属性的“PropertyChanged”调用列表,您会注意到每个绑定的XAML属性都附加了“WeakEventListener”。弱事件侦听器可以附加到事件,而不会阻止对拥有该事件的对象进行垃圾回收。

  

它在哪里订阅它。如果在运行时,怎么样?

这是您进入框架内部的地方。基本思想是UI元素具有关联的数据上下文,并且当设置或更改数据上下文时,任何绑定都订阅源事件。运行时为XAML存储可视树,数据上下文在可视树下继承。 (请注意,XAML还支持UI之类的绑定,例如“ElementName”和“RelativeSource”,它们附加到可视树中的其他元素,而不是数据上下文。)

  

接下来,它是如何知道UI上的WHICH属性更新的,因为它只知道PropertyName(据我所知),当事件被触发时,订阅事件的任何东西都会收到它。

那不太对劲。绑定包含有关源和目标的信息。它实际上包含对源对象的引用,因此它可以在收到更改通知时使用属性名称检索值。

  

我看到的越多,似乎魔术就越多地涉及设置绑定并执行UI更新。

运行时处理管道,所以你没有真正看到它。我认为关键点是使用像XAML“绑定”这样的中介对象,它可以订阅源上的事件,并根据需要更新目标。这样,源(视图模型)和目标(视图)对象保持其自主性 - 再次,解耦是观察者模式的关键点。