2012-04-09 134 views
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。我想我想知道这是否会冒泡,或者在我的UI代码隐藏之后必须拥有多余的set(这是我现在这样做的)

回答

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;} 
    } 
    ... 
} 
+0

谢谢,我不知道为什么我没有想到这一点。 :-P – 2012-04-09 20:12:43

1

如果你所要求的是如果你基本上可以说“这个属性代表另一个类的另一个属性,所以你需要看看它是否会改变”,然后不是,那是不可能的。然而,你可以自己模仿这种行为。只需附加到您的逻辑类中的PropertyChanged事件,并在MyText属性更改时,通过调用OnPropertyChanged来提高窗口的PropertyChanged事件。

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

相关问题