好吧,問題出在這裏:我寫了一個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
,以及一個被擊中時的值保持不變,但它並不能幫助我與我的問題,我認爲......
Aah off off course,some soo simple,why why not not that that! :-)它工作完美,謝謝! – RoelF