如何允许只读绑定到自定义控件DependencyProperty的内部属性?

时间:2012-08-29 13:58:59

标签: c# wpf binding dependency-properties

我正在开发一个公开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); } } // ... } 包含两个不同的属性,RangeMinimum,并且它实现了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属性或其内部道具(CustomControlSearchRange)进行任何变更后,应更新绑定目标,而无需重新分配整个Minimum。 或者,我应该允许直接绑定到内部属性(MaximumSearchRange)。

我尝试了许多不同的方法来实现这个结果,但没有一个成功。我怎样才能获得所需的结果?

提前致谢。

1 个答案:

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