2017-05-06 6 views
0

Ich habe ein benutzerdefiniertes Steuerelement, das dynamisch von einem anderen Steuerelement erstellt wird, ich möchte seinen VisualState basierend auf dem VisualState des übergeordneten Elements ändern. VisualState ist ein DependencyProperty, der einen Enumerator akzeptiert, der das Steuerelement intern innerhalb des OnPropertyChange-Ereignisses verwendet, um die Größe und das interne Layout zu ändern. Die Eigenschaft wird auf beiden Steuerungen identisch gemacht (natürlich außer dem Typ).PropertyChanged-Ereignis ausgelöst aber Wert hat sich nicht geändert

public ControlSize VisualState 
{ 
    get { return (ControlSize)GetValue(VisualStateProperty); } 
    set 
    { 
     if (value != VisualState) 
     { 
      SetValue(VisualStateProperty, value); 
     } 
    } 
} 

public static readonly DependencyProperty VisualStateProperty = DependencyProperty.RegisterAttached(nameof(VisualState), typeof(ControlSize), typeof(CountersListControl), new PropertyMetadata(ControlSize.Large, OnVisualStateChanged)); 

Die übergeordnete Steuerung dynamisch die Komponente zuweisen und bindet seine Visual an die neue Steuerung Visual:

CounterControl cc = new CounterControl(); 
cc.SetBinding(CounterControl.ValueProperty, new Binding() { Path = new PropertyPath(nameof(Counter.Amount)), Source = counter, Mode = BindingMode.TwoWay }); 
//cc.DataContext = this;//I tried with it, but it doesn't change a thing 
cc.SetBinding(CounterControl.VisualStateProperty, new Binding() { Path = new PropertyPath(nameof(VisualState)), Source = this, Mode = BindingMode.OneWay }); 

Die Value Eigenschaft bindet, ohne jede Frage zu Counter.Amount und sieht, dass Visual auch der Fall ist.

ABER die OnVisualState Methode wird aufgerufen, wenn das übergeordnete Element geändert wird, während der untergeordnete Wert nicht ist.

UPDATE: Ich gedebuggt die Bindung, wie durch @EdPlunkett vorgeschlagen, und ich war immer die folgende Meldung:

Error: Converter failed to convert value of type 'Windows.Foundation.Int32' to type 'ControlSize';

ControlSize ist eine zählbare, so sollte es in der Lage sein, es zu konvertieren.

+1

Dies hat nichts mit dem DataContext zu tun. Das kommt von Leuten, die naiven neuen XAML-Leuten sagen, dass sie "DataContext = this" überall einstellen sollen. Völliger Wahnsinn. Hunde und Katzen. Mein Gott! –

+0

Versuchen Sie [PresentationTraceSources.SetTraceLevel()] (https://msdn.microsoft.com/en-us/library/system.diagnostics.presentationtracesources.settracelevel (v = vs.110) .aspx) zu High auf der fehlerhaften Bindung, und sehen, was Sie in der Debug-Ablaufverfolgung zur Laufzeit erhalten. –

+1

@EdPlunkett Ich weiß, ich habe diesen Kommentar nur weil in vielen Fragen, die ich bei der Suche nach einer Lösung gefunden, viele Kommentare erwähnt, dass. Ich wollte nur solche Kommentare verhindern. –

Antwort

1

Das passiert, weil es irgendwie ein Int32 in ein Aufzählungszeichen konvertieren kann (selbst wenn die Quelle das gleiche Aufzählungszeichen ist).

Ich löste die Erstellung eines IValueConverter, der Int32/ControlSize-Typen konvertiert und sie der Bindung zuweist.

Binding visualStateBinding = new Binding() { Path = new PropertyPath(nameof(VisualState)), Source = this, Mode = BindingMode.OneWay, Converter = new ControlSizeConverter() }; 
Verwandte Themen