好的感谢您的意见和建议我已经修改了我的问题,以更准确地反映我的需求。
我正在阅读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触发的事件。
答案 0 :(得分:1)
由于您希望在基于Unity的环境中实现类似的功能,因此您可能最好不要再提出具体解决问题的问题。那就是说,回答你的具体问题:
WPF订阅它。
这取决于具体情况。在某些情况下,XAML编译器可以生成订阅该事件的代码。在其他情况下,这可以在运行时完成,这可以通过检查对象是否实现INotifyPropertyChanged
并订阅事件来完成。
WPF自动处理该接口提供的事件,这是自动的。界面本身不会导致这种情况本身自动发生。即在某些其他情况下,简单地实现该接口不会导致相同的事情发生。
在基于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“绑定”这样的中介对象,它可以订阅源上的事件,并根据需要更新目标。这样,源(视图模型)和目标(视图)对象保持其自主性 - 再次,解耦是观察者模式的关键点。