2010-04-14 92 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); 
    } 
} 

你能說擴展方法的人?

相關問題