0

我不知道这是否可能,但这里是解释标题中问题的代码:

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. 我想我想知道这是否会冒泡,或者除了set在我的 UI 代码隐藏中必须有冗余之外的其他任何东西(这就是我现在这样做的方式)

4

2 回答 2

2

是的,您需要从 _logic 处理 PropertyChanged 事件,然后在 LogicText 上引发等效的 PropertyChanged 通知,或者您需要在 MyText 上添加一个标准事件,因此您将有一个 MyTextChanged 事件,处理此事件,然后为 LogicText 引发 PropertyChanged .

因此,如果 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;}
    }
    ...
}
于 2012-04-09T19:59:53.523 回答
1

如果您要问的是您是否可以以某种声明性方式本质上说“此属性代表另一个类上的另一个属性,因此您需要查看它是否发生变化”,那么不,那是不可能的。但是,您可以自己模仿这种行为。只需附加到PropertyChanged逻辑类上的事件,当MyText属性更改时,PropertyChanged通过调用OnPropertyChanged.

请注意,这几乎肯定更适合您的ViewModel内容,而不是窗口代码隐藏中的内容。

于 2012-04-09T20:02:07.247 回答