2017-02-10 3 views
0

У меня есть настраиваемый элемент управления в приложении с открытым исходным кодом, который я хочу изменить.Событие TextChanged или ContentChanged в настраиваемом элементе управления, расширяющем UserControl WPF

Часть XAML выглядит следующим образом:

<controls:Scratchpad Grid.Row="1" Grid.Column="2" 
         Text="{Binding DataContext.KeyboardOutputService.Text, RelativeSource={RelativeSource AncestorType=controls:KeyboardHost}, Mode=OneWay}"/> 

отделенного кода для управления блокнота выглядит следующим образом:

public class Scratchpad : UserControl 
{ 
    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof (string), typeof (Scratchpad), new PropertyMetadata(default(string))); 

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

Я хочу, чтобы вызвать обработчик события каждый раз, когда изменения текста в UserControl. Однако нет события TextChanged, которое я могу использовать в XAML.

Мой план состоял в том, чтобы сделать что-то вроде этого:

<controls:Scratchpad Grid.Row="1" Grid.Column="2" 
         Text="{Binding DataContext.KeyboardOutputService.Text, RelativeSource={RelativeSource AncestorType=controls:KeyboardHost}, Mode=OneWay}" 
         textChanged="EventHandler"/> 

Однако событие «TextChanged» не существует в этом таможенный контроль.

Как вы можете видеть, ScratchPad расширяет UserControl. UserControl также расширяет ContentControl, и поэтому я думаю, что можно поместить текст в этот элемент управления, возможно, это событие «ContentChanged», о котором я не знаю.

Лучший, Питер.

+1

См. [Как создать настраиваемое маршрутизируемое событие] (https://msdn.microsoft.com/en-us/library/ms752288 (v = vs.110) .aspx), а затем поднимите свой пользовательский TextChangedEvent в Свойство PropertyChangedCallback свойства Text (показано в ответе Эрика). – Clemens

+0

Или объявите обычное событие CLR и запустите его в PropertyChangedCallback. – Clemens

ответ

1

Два варианта:

  1. (MVVM путь) Если изменение должно отражать то в модели предметной области, возможно, это изменение лучше всего подходит для работы в вашей ViewModel

  2. (путь управления) Вы считали, что вы поменяли обработчик в DependencyProperty?

    public static readonly DependencyProperty TextProperty = DependencyProperty.Register(nameof(Text), typeof(string), typeof(ScratchPad), new PropertyMetadata(null, OnTextChanged)); 
    
    private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
        // Handle change here 
    } 
    
0

Большое спасибо за ваш ответ Эрик.

В итоге я установил дополнительную строку кода в Setter из «KeyboardOutputService.Text». Однако, если бы я должен был добавить обработчик событий OnTextChanged, я бы попробовал ваш подход. Я могу столкнуться с той же проблемой позже, поэтому я продолжу эту тему.

Большое спасибо.

Смежные вопросы