代码之家  ›  专栏  ›  技术社区  ›  Timothy Khouri

在WPF中,如何更新自定义属性绑定到的对象?

  •  1
  • Timothy Khouri  · 技术社区  · 16 年前

    我有一个可以完美工作的自定义属性,除非它绑定到对象上。

    原因是一旦执行以下代码:

    base.SetValue(ValueProperty, value);
    

    …那我的控制权就不复存在了 跳跃 . 我知道这是因为打电话:

    base.GetBindingExpression(ValueProperty);
    

    …完全返回绑定对象- 直到 我调用base.setvalue。所以我的问题是,如何将新的“值”传递给我所绑定的对象?

    编辑:这是代码…

    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(decimal?), typeof(NumericTextBox));
    
    public decimal? Value
    {
        get
        {
            return (decimal?)base.GetValue(ValueProperty);
        }
        set
        {
            base.SetValue(ValueProperty, value);
        }
    }
    

    如您所见,它是简单的样板文件“Microsoft示例”代码。

    编辑2:这是绑定的代码…

    // Apparently, not showing this line of code here has some people confused...
    this.DataContext = new SomeClassWithAPropertyCalledNumericValue();
    
    <my:NumericTextBox Value="{Binding NumericValue}" />
    

    再一次。。。简单。

    4 回复  |  直到 15 年前
        1
  •  6
  •   mikkel    15 年前

    我想

    base.SetCurrentValue(ValueProperty, value);
    

    是你要找的

    总结 :
    设置依赖项属性的值,而不更改其值源。

        2
  •  2
  •   Timothy Khouri    16 年前

    我找到了答案,事实上没有其他人这么说,这只表明很少有人在做他们自己的自定义控件…

    1)如果您只调用“base.setvalue”,则 威尔 销毁应用于自定义属性的任何绑定-如此简单。

    2)你要做的是确定你是否被绑定,如果是,更新目标 亲自动手 (真的是微软吗?)-如果你不被束缚, 然后 可以调用base.setValue。

    这是我必须做的助手方法:

    private void SetValueOrBinding(decimal? value)
    {
        var bindingExpression = this.GetBindingExpression(ValueProperty);
    
        if (bindingExpression == null)
        {
            base.SetValue(ValueProperty, value);
        }
        else
        {
            var target = bindingExpression.DataItem;
    
            var propertyInfo = target.GetType().GetProperty(bindingExpression.ParentBinding.Path.Path);
    
            propertyInfo.SetValue(target, value, null);
        }
    }
    

    你能说扩展方法吗?

        3
  •  0
  •   Phil Sandler    16 年前

    我认为你需要发布更多的代码。您绑定到了XAML中的“NumericValue”,在您的C代码中我看不到它。

    不过,如果您绑定事实上是正确的,您可能需要离开文本框以查看更改(假设您没有以这种方式进行测试),或者使绑定看起来像这样,以随属性更改而更改:

    {Binding NumericValue, UpdateSourceTrigger=PropertyChanged}
    
        4
  •  0
  •   McAden    16 年前

    您绑定到numericvalue,但没有向我们显示numericvalue。纯粹基于上面的代码,您的绑定应该遵循以下几行:

    <my:NumericTextBox Text="{Binding Value}" />
    

    如果您真的打算将“value”绑定到“numericvalue”,那么您必须向我们显示numericvalue的dependencyProperty。