2010-04-14 90 views
1

我有一个完美的自定义属性,除非它绑定到一个对象。在WPF中,如何更新我的自定义属性绑定的对象?

的原因是,一旦下面的代码被执行:

base.SetValue(ValueProperty, value); 

...然后我的控制不再约束。我知道这是因为呼吁:

base.GetBindingExpression(ValueProperty); 

...完全返回绑定对象 - UNTIL我打电话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); 
    } 
} 

正如你所看到的,这很简单,样板, “微软示例” 的代码。

编辑2:下面是绑定代码...

// Apparently, not showing this line of code here has some people confused... 
this.DataContext = new SomeClassWithAPropertyCalledNumericValue(); 

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

再次...简单。

+2

您能告诉我们(a)您的自定义属性和(b)绑定的代码吗? – Heinzi 2010-04-14 17:12:38

+0

当然...现在加入它。 – 2010-04-14 17:17:21

+0

答案就像做TwoWay绑定和实现属性更改通知一样简单吗? – Ragepotato 2010-04-14 17:25:17

回答

6

我觉得

base.SetCurrentValue(ValueProperty, value); 

是你在找什么

摘要
设置依赖项属性的值而不更改其值源。

+0

令人惊叹! - 我已经改变了我的答案,而不是我自己的答案......我将尽快删除我从项目中制作的扩展方法。再次感谢! – 2011-01-16 03:12:33

0

我想你需要发布更多的代码。你绑定到XAML中的“NumericValue”,我没有在你的C#代码中看到。

尽管如此,如果您的绑定事实上是正确的,您可能需要移除文本框才能看到更改(假设您没有以此方式进行测试),或者使绑定显示像这样改变属性更改:

{Binding NumericValue, UpdateSourceTrigger=PropertyChanged} 
0

您绑定到NumericValue,但您不显示我们NumericValue。纯粹基于上面的代码,你的结合应该是沿着线的东西:

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

如果你真的是意为结合“价值”到“NumericValue”,那么你将不得不向我们展示的DependencyProperty为NumericValue。

+0

NumericTextBox是我自己的自定义类......它没有“文本”属性,它有一个“值”属性。我将自定义类的“Value”属性绑定到一个名为NumericValue的小数,它是附加的datacontext的一部分。 – 2010-04-14 19:18:03

+0

并且是NumericValue一个DependencyProperty? – McAden 2010-04-15 04:00:26

2

我已经找到了答案,而事实上,没有其他人说,这只是表明,极少数人正在自己的自定义控件...

1)如果你只需要调用“base.SetValue “,你销毁应用到你的自定义属性的任何绑定 - 就这么简单。

2),你必须做的是,确定是否绑定如果是这样,更新目标自己手动(真的微软)? - 如果你没有绑定,那么可以打电话的基础。设定值。

这里的辅助方法,我不得不做出:

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); 
    } 
} 

你能说扩展方法的人?

相关问题