使用DependencyProperty在TextBox上添加IsDirty-Flag

时间:2017-10-11 15:00:31

标签: c# wpf dependency-properties

我有问题,我有一个现有的模型对象,我无法扩展。实际问题有点复杂,所以我试着将其分解。

我希望使用依赖项属性扩展TextBox以指示文本已更改。所以我提出了以下解决方案:

public class MyTextField : TextBox
{
    public MyTextField()
    {
        this.TextChanged += new TextChangedEventHandler(MyTextField_TextChanged);
    }

    private void MyTextField_TextChanged(object sender, TextChangedEventArgs e)
    {
        IsDirty = true;
    }
    public static DependencyProperty IsDirtyProperty = DependencyProperty.Register(
        "IsDirtyProperty",
        typeof(bool),
        typeof(MyTextField),
        new PropertyMetadata(false));

    public bool IsDirty
    {
        get { return (bool)GetValue(IsDirtyProperty); }
        set { SetValue(IsDirtyProperty, value); }
    }
}

XAML:

<my:MiaTextField Text="{Binding Barcode}" IsDirty="{Binding IsDirty}"/>

因此,如果我更改TextBox中的文字,则isDirty属性应更改为true。 但我得到了一个System.Windows.Markup.XamlParseException:绑定只能设置为“DependencyObject”的“DependencyProperty”。

2 个答案:

答案 0 :(得分:5)

将{4}&#34;,即依赖属性的CLR包装器的名称传递给DependencyProperty.Register方法:

public static DependencyProperty IsDirtyProperty = DependencyProperty.Register(
    "IsDirty",
    typeof(bool),
    typeof(MyTextField),
    new PropertyMetadata(false));

如果您使用的是C#6 / Visual Studio 2015或更高版本,则可以使用nameof运算符:

public static DependencyProperty IsDirtyProperty = DependencyProperty.Register(
    nameof(IsDirty),
    typeof(bool),
    typeof(MyTextField),
    new PropertyMetadata(false));

答案 1 :(得分:1)

或者你可以override the PropertyMetadata TextProperty:

public class MyTextBox : TextBox
{
    static MyTextBox()
    {
        TextProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata("", IsDirtyUpdateCallback));
    }

    private static void IsDirtyUpdateCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is MyTextBox tb && e.NewValue != e.OldValue && e.Property == TextProperty)
        {
            tb.IsDirty = (string)e.OldValue != (string)e.NewValue;
        }
    }



    public bool IsDirty
    {
        get { return (bool)GetValue(IsDirtyProperty); }
        set { SetValue(IsDirtyProperty, value); }
    }

    public static readonly DependencyProperty IsDirtyProperty =
        DependencyProperty.Register("IsDirty", typeof(bool), typeof(MyTextBox), new PropertyMetadata(true));
}

自动设置你的IsDirty:o)多一种方式到罗马。但是对于你的问题,有点用大炮射击小鸟(德国谚语)