2017-02-10 18 views
0

変更したいオープンソースアプリケーションにカスタムコントロールがあります。UserControl WPFを拡張するカスタムコントロール内のTextChangedまたはContentChangedイベント

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); } 
    } 
} 

。ただし、XAMLで使用できるTextChangedイベントはありません。 「textChanged」イベントは、このカスタムコントロールに存在しないただし

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

私の計画は、このような何かをすることでした。

ご覧のとおり、ScratchPadはUserControlを拡張しています。 UserControlもContentControlを継承しています。そのため、このコントロールにテキストを挿入することは可能ですが、私が知らない「ContentChanged」イベントになる可能性があります。

ベスト、ピーター。

+1

[カスタムルーテッドイベントの作成方法](https://msdn.microsoft.com/en-us/library/ms752288(v = vs.110).aspx)を参照して、カスタムTextChangedEventをTextプロパティのPropertyChangedCallback(Ericの答えに示されています)。 – 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

おかげであなたの答えエリックのためにたくさん。

私は "KeyboardOutputService.Text"のセッターに余分なコード行を入れてしまいました。しかし、OnTextChangedイベントハンドラを追加する場合、私はあなたのアプローチを試してみます。私は後で同じ問題に遭遇するかもしれないので、私はこのスレッドを維持します。

ありがとうございます。

関連する問題