2016-04-26 7 views
0

У меня есть UserControl. Он содержит одно текстовое поле с Adorner (удалены для краткости)TwoWay DataBinding в 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> 

Я его связывание не «Текст» из 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)); 
    } 

сеттер это никогда не вызывается. Поэтому, когда я привязываюсь к этому пользовательскому элементу управления, привязки никогда не обновляются. Что я могу сделать, чтобы исправить привязку?

ответ

1

Привязки не используют геттеры и сеттеры, они напрямую используют GetValue и SetValue. Вам также не нужно реализовывать INotifyPropertyChanged. Чтобы указать обработчик изменений, включите его в определение метаданных следующим образом:

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) { 
    //.... 
}