我正在开发一个公开CustomControl
DependencyProperty
的{{1}},它基于自定义类SearchRange
。
Range
班级public class MyCustomControl : Control
{
public static readonly DependencyProperty SearchRangeProperty
= DependencyProperty.Register(
"SearchRange",
typeof (Range<DateTime>),
typeof (VariableBrowser));
// ...
public Range<DateTime> SearchRange
{
get { return (Range<DateTime>)this.GetValue(SearchRangeProperty); }
set { this.SetValue(SearchRangeProperty, value); }
}
// ...
}
包含两个不同的属性,Range
和Minimum
,并且它实现了Maximum
。
INotifyPropertyChanged
我遵循的规范要求使用我的自定义控件的应用程序应该只能绑定到public class Range<T> : INotifyPropertyChanged where T : IComparable
{
private T _maximum;
private T _minimum;
public T Maximum
{
get { return this._maximum; }
set
{
this._maximum = value;
this.OnPropertyChanged("Maximum");
}
}
public T Minimum
{
get { return this._minimum; }
set
{
this._minimum = value;
this.OnPropertyChanged("Minimum");
}
}
// ...
}
属性才能读取其内部值(SearchRange
和{{1} }),因为这些必须在内部处理,并由我的Minimum
设置。在对Maximum
属性或其内部道具(CustomControl
和SearchRange
)进行任何变更后,应更新绑定目标,而无需重新分配整个Minimum
。
或者,我应该允许直接绑定到内部属性(Maximum
和SearchRange
)。
我尝试了许多不同的方法来实现这个结果,但没有一个成功。我怎样才能获得所需的结果?
提前致谢。
答案 0 :(得分:0)
最小值和最大值应该有两个依赖属性,注册property changed callback。在此回调中,您可以从新值构造范围,并在range属性上使用SetCurrentValue
(这可以保持绑定完整)。您还可以为range属性提供回调,使用SetCurrentValue更新其他两个属性。
伪代码:
private static void MinChangedCallback(DependencyObject o, TheRightKindOfArgs e)
{
var control = (MyCustomControl)o;
control.UpdateRange((DateTime)e.NewValue, Maximum);
}
private static void MaxChangedCallback(DependencyObject o, TheRightKindOfArgs e)
{
var control = (MyCustomControl)o;
control.UpdateRange(Minimum, (DateTime)e.NewValue);
}
private void UpdateRange(DateTime min, DateTime max)
{
var range = new Range<DateTime>(min, max);
SetCurrentValue(SearchRangeProperty, range);
}