2012-04-09 131 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中的某些內容,而不是窗口中的代碼隱藏內容。

相關問題