2016-04-26 16 views
0

Ich habe ein UserControl. Es enthält eine einzelne Textbox mit einem Adorner (der Kürze halber entfernt)TwoWay DataBinding in einem UserControl

<UserControl x:Class="Test.UserControlBindings"   
     DataContext="{Binding Mode=OneWay, RelativeSource={RelativeSource Self}}" 
     mc:Ignorable="d" KeyboardNavigation.TabNavigation="Cycle" x:Name="Control" 
     d:DesignHeight="300" d:DesignWidth="300" > 
    <AdornerDecorator> 
     <TextBox x:Name="InputTextBox" VerticalContentAlignment="Center" Text="{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" FontSize="{Binding ElementName=Control, Path=FontSize}"/> 
    </AdornerDecorator> 
</UserControl> 

ich bin Bindung an "Text" des Usercontrol

public partial class WatermarkTextBox : INotifyPropertyChanged { 
    private static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(WatermarkTextBox), new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

    public WatermarkTextBox() { 
     this.InitializeComponent(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public string Text { 
     get { 
      return (string)GetValue(TextProperty); 
     } 

     set { 
      this.SetValue(TextProperty, value); 
      OnPropertyChanged("Text"); 
     } 
    } 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged(string propertyName = null) { 
     PropertyChangedEventHandler handler = this.PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

Der Setter nie aufgerufen wird. Wenn ich also an dieses Benutzersteuerelement binde, werden die Bindungen nie aktualisiert. Was kann ich tun, um die Bindung zu reparieren?

Antwort

1

Bindungen verwenden nicht die Getter und Setter, sie verwenden GetValue und SetValue direkt. Sie müssen auch nicht INotifyPropertyChanged implementieren. Um einen Änderungshandler anzugeben, schließen Sie ihn in Ihre Metadatendefinition wie folgt ein:

public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
    "Text", typeof(string), typeof(WatermarkTextBox), 
    new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
     (s, e) => ((WatermarkTextBox)s).OnTextChanged((string)e.OldValue, (string)e.NewValue)) 
); 

public string Text { 
    get { return (string)this.GetValue(TextProperty); } 
    set { this.SetValue(TextProperty, value); } 
} 

void OnTextChanged(string oldValue, string newValue) { 
    //.... 
} 
Verwandte Themen