2016-06-06 11 views
2

Ich habe die folgende benutzerdefinierte Steuerung auf der Grundlage der „schwere Option“ bei this Link:WPF-Ereignis ausgelöst Nicht wenn Abhängigkeitseigenschaft geändert

public partial class SelectableContentControl : ContentControl 
{ 
    public SelectableContentControl() 
    { 
     InitializeComponent(); 
     var isCheckedDesc = DependencyPropertyDescriptor.FromProperty(IsCheckedProperty, typeof(SelectableContentControl)); 
     isCheckedDesc.AddValueChanged(this, IsCheckedPropertyChanged); 
    } 

    public bool IsChecked 
    { 
     get { return (bool)GetValue(IsCheckedProperty); } 
     set { SetValue(IsCheckedProperty, value); } 
    } 

    public static readonly DependencyProperty IsCheckedProperty = 
     DependencyProperty.Register("IsChecked", typeof(bool), 
      typeof(SelectableContentControl), new PropertyMetadata(false)); 

    private void IsCheckedPropertyChanged(object sender, EventArgs e) 
    { 
     var selectable = Content as IAmSelectable; 
     if (selectable != null) selectable.IsSelected = IsChecked; 
    } 
} 

Der Stil für die SelectableContentControl ist wie folgt definiert:

<Style TargetType="{x:Type controls1:SelectableContentControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type controls1:SelectableContentControl}"> 
       <CheckBox IsChecked="{TemplateBinding IsChecked}"/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

... und meine Nutzung:

<controls:SelectableContentControl Grid.Row="2" Content="{Binding Dummy}" IsChecked="{Binding Dummy.IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

Iwollenwird aufgerufen, wenn sich der Wert IsChecked auf der Benutzeroberfläche ändert, aber dies geschieht nicht. Wer sieht was ich vermisse?

Antwort

5

TemplateBinding Arbeiten in einem OneWay Modus, was bedeutet, dass der Wert nur dann aktualisiert wird in der Quelle-Ziel-Richtung (Ihre Steuer die Quelle ist und die CheckBox in der Vorlage das Ziel). Wenn Sie die Bindung arbeiten in TwoWay Modus möchten, sollten Sie eine normale Binding statt:

<ControlTemplate TargetType="{x:Type controls1:SelectableContentControl}"> 
    <CheckBox IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}}" /> 
</ControlTemplate> 

Beachten Sie, dass Sie nicht brauchen, Mode=TwoWay auf die Bindung zu spezifizieren, weil CheckBox.IsChecked Eigenschaft in Zwei-Wege-Modus bindet durch Standard.

Weitere Informationen finden Sie unter this question.

+1

Danke, das war es total. Das Universum hätte vor dem Hitzetod geendet, bevor ich das herausgefunden hatte. – ket

Verwandte Themen