2017-02-10 74 views
0

我想在一個開源應用程序中進行自定義控件的更改。擴展UserControl的自定義控件中的TextChanged或ContentChanged事件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); } 
    } 
} 

我希望每次在用戶控件的文本更改爲觸發事件處理程序。但是,我不能在XAML中使用TextChanged事件。

我的計劃是做這樣的事情:

<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」事件。

Best,Peter。

+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方式)如果改變以反映域模型的東西,也許這種變化是最適合您的視圖模型

  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」的Setter中添加了一行代碼。但是,如果我要添加一個OnTextChanged事件處理程序,我會嘗試你的方法。我可能會在稍後遇到同樣的問題,所以我會保持這個線程。

非常感謝。