我不知道这是否可行,但这里是解释标题中问题的代码:
public class LogicClass : INotifyPropertyChanged
{
private String _myText;
public String MyText
{
get{return _myText;}
set
{
_myText = value;
PropertyChanged(this, new PropertyChangedEventArgs("MyText"));
}
}
...
}
public partial class Window1: Window, INotifyPropertyChanged
{
private LogicClass _logic;
public String LogicText
{
get{return _logic.MyText;}
}
...
}
<ContentControl Name="contentControl1" >
<Binding ElementName="MainWindow" Path="LogicText"/>
</ContentControl>
有没有办法让这项工作,而不必公开我的LogicClass
变量并使用其INotifyPropertyChanged
的实现。我想我想知道这是否会冒泡,或者除了必须在我的UI代码隐藏中使用冗余set
之外的任何事情(这就是我现在这样做的方式)
答案 0 :(得分:2)
是的,你需要从_logic处理PropertyChanged事件然后在LogicText上引发一个等效的PropertyChanged通知,或者你需要在MyText上添加一个标准事件,所以你将有一个MyTextChanged事件,处理它然后提高PropertyChanged for LogicText。
因此,如果LogicClass永远不会直接绑定在Xaml中,那么你就不需要在LogicClass上实现INotifyPropertyChanged,你可以这样做(类似):
public class LogicClass
{
private String _myText;
public event EventHandler MyTextChanged;
public String MyText
{
get{return _myText;}
set
{
_myText = value;
var handler = MyTextChanged;
if(handler != null){ MyTextChanged(this, EventArgs.Empty); }
}
}
...
}
public partial class Window1: Window, INotifyPropertyChanged
{
private LogicClass _logic;
public Window1()
{
_logic = ... initialised;
_logic.MyTextChanged += (s,e) => RaisePropertyChanged("LogicText");
}
public String LogicText
{
get{return _logic.MyText;}
}
...
}
答案 1 :(得分:1)
如果你问的是你是否可以说“这个属性代表另一个类的另一个属性,所以你需要以某种声明的方式查看它是否会发生变化”,那么不,那是不可能的。但是,您可以自己模仿这种行为。只需附加到逻辑类的PropertyChanged
事件,当MyText
属性发生更改时,通过调用PropertyChanged
来提升窗口的OnPropertyChanged
事件。
请注意,这几乎肯定更适合于ViewModel
中的内容,而不是窗口代码隐藏中的内容。