DependencyProperty-binding-Modus twoway aber propertychangedeventhandler null ist

Ich versuche zu Folgen, das MVVM-design Paradigma mit C# und XAML. Ich bin in Schwierigkeiten mit einer verschachtelten Benutzer-Steuerelement. Ich bin versucht zu binden, die ein element auf der verschachtelten Benutzer-Steuerelement die Werte in der ViewModel (die gebunden ist an die Ansicht über die DataContext-Eigenschaft). Das gleiche ViewModel verwendet für die äußere und die verschachtelten Benutzer-Steuerelemente.

Es teilweise funktioniert, wie es ist, aber Veränderungen gehen nur one-way vom ViewModel an die verschachtelten Benutzer-Steuerelement. Ich brauche die Veränderungen, die in den verschachtelten Benutzer-Steuerelement weitergeben zurück auf das ViewModel.

Beginnend mit der XAML-Code für die Hauptansicht habe ich:

<UserControl>

   <!-- ... -->

   <UserControl.DataContext>
      <local:MyViewModel x:Name="myViewModel" />
   </UserControl.DataContext>

   <!-- ... -->

   <local:NestedUserControl
      x:Name="nestedUserControl"
      CustomNestedValue="{Binding Path=CustomValue, ElementName=myViewModel, Mode=TwoWay}" />

</UserControl>

In der C# - code für die ViewModel:

//Constructor
public MyViewModel()
{
   CustomValue = true;
}

private bool _customValue;
public bool CustomValue
{
   get { return _customValue; }
   set
   {
       if (_customValue != value)
       {
          _customValue = value;
          RaisePropertyChanged ("CustomValue");
       }
   }
}

Und im code hinter der NestedUserControl habe ich:

public static readonly DependencyProperty CustomNestedValueProperty =
   DependencyProperty.Register (
      "CustomNestedValue",
      typeof (bool),
      typeof (NestedUserControl),
      new FrameworkPropertyMetatdata
      {
         BindsTwoWayByDefault = true,
         PropertyChangedCallback = 
            new PropertyChangedCallback (CustomNestedValueChangedCallback)
      });

public bool CustomNestedValue
{
   get { return (bool) GetValue (CustomNestedValueProperty); }
   set { SetValue (CustomNestedValueProperty, value); }
}

protected static void CustomNestedValueChangedCallback (
   DependencyObject Source,
   DependencyPropertyChangedEventArgs e)
{
   bool value = (bool) e.NewValue;
   NestedUserControl control = source as NestedUserControl;
   control.OnCustomValueChange (value);
}

public void OnCustomValueChange (bool value)
{
   RaisePropertyChanged ("CustomNestedValue");

   //Do other stuff ...
}

//This function is where the nested user control gets direct
//interactions from the user which cause the dependency
//property to change.  When this event occurs, the change needs
//to be communicated back up to the view model.
private void _onPreviewMouseDown (object sender, MouseButtonEventArgs e)
{
   CustomNestedValue = !CustomNestedValue;
}

[Anmerkung: Nicht nur, dass ich den binding-Modus für Bidirektionale Einstellung, wenn die Bindung in XAML, aber ich versuchte dies das Standardverhalten des DependencyProperty-im code oben. Kein Glück.]

Sowohl der code hinter der verschachtelten Benutzer-Steuerelement und die ViewModel-code enthalten, der unter PropertyChangedEventHandler Ereignis/Reaktion, die notwendig ist für die INotifyPropertyChanged - Schnittstelle. Von dem was ich verstehe, das ist, wie Bindungen zwischen XAML-Elemente und die ViewModel synchronisiert werden.

public event PropertyChangedEventHandler PropertyChanged;

protected void RaisePropertyChanged(string propertyName)
{
   try
   {
      if (this.PropertyChanged != null)
         this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
   }
   catch (Exception e)
   {
      // ...
   }
}

Wenn ich den code ausführen, Wann immer die RaisePropertyChanged Funktion wird aufgerufen, für die NestedUserControl, die PropertyChanged Ereignis ist immer null. Dies ist nur ein problem für die geschachtelte usercontrol, und nicht die äußeren. Sollte dies nicht Fall automatisch über den Mechanismus für die Bindung?

Ich ve wurde kämpfen mit diesem für mehrere Tage jetzt ohne Erfolg. Jede Hilfe wäre sehr geschätzt werden. Danke!

InformationsquelleAutor RobotNerd | 2011-04-22
Schreibe einen Kommentar