1

我创建了一个扩展 RichTextBox 的自定义控件,以便可以为 xaml 属性创建绑定。只要我只是从视图模型更新属性,这一切都很好,但是当我尝试在richtextbox中编辑时,属性不会更新回来。

我在富文本框的扩展版本中有以下代码。

    public static readonly DependencyProperty TextProperty = DependencyProperty.Register ("Text", typeof(string), typeof(BindableRichTextBox), new PropertyMetadata(OnTextPropertyChanged));

    private static void OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var rtb = d as BindableRichTextBox;
        if (rtb == null) 
            return;

        string xaml = null;
        if (e.NewValue != null)
        {
            xaml = e.NewValue as string;
            if (xaml == null)
                return;
        }

        rtb.Xaml = xaml ?? string.Empty;
    }

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

在视图中,我已经设置了这样的绑定

<Controls:BindableRichTextBox Text="{Binding XamlText, Mode=TwoWay}"/>

在视图模型中,我将 XamlText 创建为普通属性,并在更新时调用 NotifyPropertyChanged 事件。

我希望当用户在丢失焦点上或直接在编辑期间在 RichTextBox 中输入文本时更新绑定的 XamlText,这并不重要。

如何更改代码以实现此目的?

4

1 回答 1

0

您将需要听取对Xaml-property 的更改BindableRichTextBox并相应地设置Text-property。这里有一个答案,描述了如何实现这一点。使用其中描述的方法将导致以下代码(未经测试):

public BindableRichTextBox()
{
    this.RegisterForNotification("Xaml", this, (d,e) => ((BindableRichTextBox)d).Text = e.NewValue);
}

public void RegisterForNotification(string propertyName, FrameworkElement element, PropertyChangedCallback callback)
{
    var binding = new Binding(propertyName) { Source = element };
    var property = DependencyProperty.RegisterAttached(
        "ListenAttached" + propertyName,
        typeof(object),
        typeof(UserControl),
        new PropertyMetadata(callback));
    element.SetBinding(property, binding);
}
于 2013-10-17T11:55:33.713 回答