2011-07-26 52 views
14

好吧,問題出在這裏:我寫了一個UserControl,它接收一個新值,比如說每100ms執行一次,然後執行一些操作。它必須處理每個新值設置器,即使值沒有改變。該用戶控件有幾個DependencyProperties:當新值相同時,DependencyProperty不會觸發ValueChanged

public double CurrentValue 
    { 
     get { return (double)GetValue(CurrentValueProperty); } 
     set { SetValue(CurrentValueProperty, value); } 
    } 

    public static readonly DependencyProperty CurrentValueProperty = 
     DependencyProperty.Register("CurrentValue", typeof(double), typeof(GraphControl), new UIPropertyMetadata(0d)); 

在XAML在使用這種控制,我只設置CurrentValue的的Binding到(啓用INotifyPropertyChanged的-)特性:

<uc:UserControl CurrentValue="{Binding MyValue}" ... /> 

視圖模型:

public double MyValue 
    { 
     get { return _value; } 
     set 
     { 
      //if (_value == value) return; 
      _value= value; 
      if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs("MyValue")); 
     } 
    } 

正如你所看到的,我明確地註釋掉了if equals then return,所以即使當值得到upd時它也會觸發PropertyChanged事件達到相同的價值。

現在回到我的用戶控制,我嘗試以兩種方式註冊ValueChanged;首先使用DependencyPropertyDescriptor

var propertyDescriptor = DependencyPropertyDescriptor.FromProperty(CurrentValueProperty, typeof(GraphControl)); 
propertyDescriptor.AddValueChanged(this, OnCurrentValueChanged); 

或使用UIPropertyMetaData

new UIPropertyMetadata(0d, OnCurrentValueChangedCallback) 

所以回調的短線會是什麼樣子:

private void Callback(object sender, EventArgs e){ 
    //do stuff 
} 

好現在的問題是,在當值沒有明確改變時,回調不會被觸發。我檢查了,並且PropertyChanged事件在我的視圖模型中觸發,但控件沒有看到更改。當該值更改爲新值時,它將按預期處理回調。
有什麼辦法可以重寫這種行爲,以便我的回調方法總是會被打?

編輯:
我也嘗試使用CoerceValueCallback,以及一個被擊中時的值保持不變,但它並不能幫助我與我的問題,我認爲......

回答

4

你可以將你的值包裝在一個對象中,即創建一個類來保存它 - 然後每次將該屬性設置爲包含新值的該類的新實例。這意味着你每秒創建〜10個對象,但它們各有不同,會觸發變化事件,並且只是很小(無論如何都會被GC'd)。 :)

+0

Aah off off course,some soo simple,why why not not that that! :-)它工作完美,謝謝! – RoelF

0

另一種替代方法是將該值暫時切換爲其他值,然後恢復上一個值。您可以在強制回調透明爲此整個招這樣:

public static readonly DependencyProperty TestProperty = DependencyProperty.Register(
    "Test", typeof(object), typeof(School), 
    new PropertyMetadata(null, TestChangedCallback, TestCoerceCallback)); 

static object TestCoerceCallback(DependencyObject d, object baseValue) 
{ 
    if (baseValue != null && (d.GetValue(TestProperty) == baseValue)) 
    { 
     d.SetCurrentValue(TestProperty, null); 
     d.SetCurrentValue(TestProperty, baseValue); 
    } 
    return baseValue; 
} 

只要確保你的財產的代碼可以妥善地處理null值情況。

相關問題