2017-02-10 75 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事件处理程序,我会尝试你的方法。我可能会在稍后遇到同样的问题,所以我会保持这个线程。

非常感谢。

相关问题