2012-04-09 12 views
0

Ich weiß nicht, ob dies möglich ist oder nicht, aber hier ist der Code die Frage im Titel zu erklären:Ist es möglich, an eine private Variable gebundene Eigenschaft zu binden?

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> 

Gibt es eine Möglichkeit, diese Arbeit zu machen, ohne dass meine LogicClass Variable aussetzen und machen Gebrauch von seiner Implementierung von INotifyPropertyChanged. Ich denke, ich möchte wissen, ob dies kann Blase, oder etwas anderes als eine redundante set in meinem UI Code-Behind haben müssen (was ist, wie ich das jetzt mache)

Antwort

2

Ja, müssen Sie entweder mit der PropertyChanged-Ereignis von _logic und löst dann eine entsprechende PropertyChanged-Benachrichtigung in LogicText aus, oder Sie müssen ein Standardereignis in MyText hinzufügen, sodass Sie ein MyTextChanged-Ereignis haben, dieses behandeln und dann das PropertyChanged für LogicText erhöhen.

Also, wenn LogicClass wenn nie in der XAML direkt gebunden ist, würden Sie nicht INotifyPropertyChanged auf LogicClass implementieren müssen und Sie tun würden (so etwas wie) diese:

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

Danke, ich weiß nicht, warum ich nicht darüber nachgedacht habe. :-p –

1

Wenn das, was Sie fragen, ist Wenn Sie im Wesentlichen sagen können "Diese Eigenschaft repräsentiert eine andere Eigenschaft in einer anderen Klasse, also müssen Sie nachsehen und sehen, ob sich diese ändert" in deklarativer Weise, dann ist das nicht möglich. Sie können dieses Verhalten jedoch selbst nachahmen. Fügen Sie einfach das Ereignis PropertyChanged Ihrer Logikklasse an, und wenn sich die Eigenschaft MyText ändert, erhöhen Sie das Ereignis PropertyChanged des Fensters, indem Sie OnPropertyChanged aufrufen.

Beachten Sie, dass dies fast sicher besser für etwas geeignet ist, das in Ihrem ViewModel, nicht etwas im Codebehind auf dem Fenster geht.

Verwandte Themen