依赖属性 - 更新源

时间:2011-09-01 08:33:43

标签: wpf data-binding

我使用自定义依赖属性疯狂。我已在这里检查了大量的线程,但还没有找到任何解决方案。我想要做的是,如果源提供特定值(对于给定示例为null),则替换Property的值。无论我尝试什么,源中的属性值都保持为null并且永远不会更新。

这是我的自定义控件:

public class TextBoxEx : TextBox
{
    public TextBoxEx()
    {
        TrueValue = 0;
        this.TextChanged += (s, e) =>
        {
            TrueValue = Text.Length;
            SetCurrentValue(MyPropertyProperty, TrueValue);
            var x = BindingOperations.GetBindingExpression(this, MyPropertyProperty);
            if (x != null)
            {
                x.UpdateSource();
            }
        };
    }

    public int? TrueValue { get; set; }

    public int? MyProperty
    {
        get { return (int?)GetValue(MyPropertyProperty); }
        set { SetValue(MyPropertyProperty, value); }
    }

    public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.Register("MyProperty", typeof(int?), typeof(TextBoxEx), new PropertyMetadata(null, PropertyChangedCallback));

    private static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (e.NewValue == null)
        {
            d.SetCurrentValue(MyPropertyProperty, (d as TextBoxEx).TrueValue);
        }
    }
}

这是我绑定的DataContext:

public class VM : INotifyPropertyChanged
{
    private int? _Bar = null;

    public int? Bar
    {
        get { return _Bar; }
        set
        {
            _Bar = value;
            OnPropertyChanged("Bar");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

My Binding看起来像这样:

<local:TextBoxEx MyProperty="{Binding Bar, UpdateSourceTrigger=PropertyChanged}"/>

请记住:我需要一个TwoWay绑定,因此OneWayToSource对我不起作用。

知道我没有进入这里吗?

2 个答案:

答案 0 :(得分:6)

您只需将绑定设置为双向即可。但由于这应该是默认值,您可以使用以下元数据相应地注册属性:

... new FrameworkPropertyMetadata(null,
                                  FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                                  PropertyChangedCallback)

获取TextChanged处理程序中的表达式并手动更新源代码不是必需的,因此我会删除该代码。


如果您没有在绑定上明确设置模式,则会使用默认值the documentation

  

默认值:使用绑定目标的默认Mode值。每个依赖项属性的默认值都不同。通常,用户可编辑的控件属性(例如文本框和复选框的属性)默认为双向绑定,而大多数其他属性默认为单向绑定。确定依赖项属性是默认绑定单向还是双向的一种编程方法是使用GetMetadata获取属性的属性元数据,然后检查BindsTwoWayByDefault属性的布尔值。 / p>

答案 1 :(得分:0)

正如你所写:“记住:我需要一个TwoWay绑定”,所以:

<local:TextBoxEx MyProperty="{Binding Bar, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>