1

我在想要更改的开源应用程序中有一个自定义控件。

XAML 如下所示:

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

Scratchpad 控件的代码隐藏如下所示:

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

最好的,彼得。

4

2 回答 2

2

两种选择:

  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
    }
    
于 2017-02-10T14:18:53.760 回答
0

非常感谢您的回答埃里克。

我最终在“KeyboardOutputService.Text”的 Setter 中添加了一行额外的代码。但是,如果我要添加一个 OnTextChanged 事件处理程序,我会尝试您的方法。我以后可能会遇到同样的问题,所以我会保持这个线程。

非常感谢。

于 2017-02-10T15:08:27.043 回答