我有一个有两个属性的控件。一个是DependencyProperty
,另一个是第一个的“别名”。当第一个被更改时,如何为第二个(别名)引发PropertyChanged
事件?
注意:我使用的是DependencyObjects
,而不是INotifyPropertyChanged
(尝试过,但不起作用,因为我的控件是ListVie
子类)
像这样的事情...
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
if (e.Property == MyFirstProperty)
{
RaiseAnEvent( MySecondProperty ); /// what is the code that would go here?
}
}
如果我用的是INotify,我可以这样做...
public string SecondProperty
{
get
{
return this.m_IconPath;
}
}
public string IconPath
{
get
{
return this.m_IconPath;
}
set
{
if (this.m_IconPath != value)
{
this.m_IconPath = value;
this.SendPropertyChanged("IconPath");
this.SendPropertyChanged("SecondProperty");
}
}
}
我在哪里可以从一个setter在多个属性上引发PropertyChanged
事件?我需要能够做同样的事情,只使用DependencyProperties
。
6条答案
按热度按时间zzzyeukh1#
我遇到了类似的问题,我有一个依赖属性,我希望类侦听更改事件以从服务获取相关数据。
blmhpbnm2#
1.在类中实现
INotifyPropertyChanged
。1.注册依赖项属性时,在属性元数据中指定回调。
1.在回调中,引发
PropertyChanged
事件。添加回调:
在回调中引发
PropertyChanged
:ulydmbyx3#
我认为OP问错了问题。下面的代码将显示,没有必要手动从依赖属性引发
PropertyChanged
EVENT来获得所需的结果。方法是处理依赖属性上的PropertyChanged
CALLBACK,并在那里设置其他依赖属性的值。下面是一个工作示例。在下面的代码中,MyControl
具有两个相关性属性-ActiveTabInt
和ActiveTabString
。当用户单击主机上的按钮(MainWindow
)时,ActiveTabString
将被修改。相关性属性上的PropertyChanged
CALLBACK将设置ActiveTabInt
的值。MyControl
不会手动引发PropertyChanged
EVENT。MainWindow.xaml.cs
MainWindow.xaml
App.xaml
hkmswyz64#
我同意Sam和Xaser的观点,并且实际上做得更深入一些。我认为您根本不应该在
UserControl
中实现INotifyPropertyChanged
接口...该控件已经是DependencyObject
,因此已经带有通知。将INotifyPropertyChanged
添加到DependencyObject
是多余的,而且在我看来“闻起来”不对劲。我所做的是按照Sam的建议将这两个属性都实现为
DependencyProperties
,然后简单地让“first”依赖属性中的PropertyChangedCallback
更改“second”依赖属性的值。由于这两个属性都是依赖属性,因此它们都会自动向任何感兴趣的订阅者发出更改通知(例如,数据绑定等)。在本例中,依赖项属性A是字符串
InviteText
,它触发依赖项属性B(名为ShowInvite
的Visibility
属性)的更改。如果您希望能够通过数据绑定将某些文本完全隐藏在控件中,则这是一种常见的使用情况。注意这里没有包括
UserControl
签名或构造函数,因为它们没有什么特别之处;它们根本不需要从INotifyPropertyChanged
继承子类。b5lpy0ml5#
我怀疑当第一个属性发生变化时,在第二个属性上引发
PropertyChanged
事件的逻辑。如果第二个属性值发生变化,那么PropertyChanged
事件可能会在那里引发。无论如何,你的问题的答案是你应该实现
INotifyPropertyChange
。这个接口包含PropertyChanged
事件。实现INotifyPropertyChanged
可以让其他代码知道这个类有PropertyChanged
事件,这样代码就可以挂接一个处理程序。实现INotifyPropertyChange
之后,进入OnPropertyChanged
的if语句的代码是:2ic8powd6#
基于前面已被接受的答案,对我来说,没有强制转换就无法访问非静态
PropertyChanged
:1.在类中实现
INotifyPropertyChanged
,例如UserControl CustomView
1.注册依赖项属性时,在属性元数据中指定回调。
1.在回调中,强制转换并引发
PropertyChanged
事件。添加回调:
强制转换发送方并在回调中引发PropertyChanged: