是否有可能绑定到私有变量暴露属性?

时间:2012-04-09 19:56:22

标签: c# wpf data-binding

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

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之外的任何事情(这就是我现在这样做的方式)

2 个答案:

答案 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中的内容,而不是窗口代码隐藏中的内容。