1

我正在开发一个基于自定义类的CustomControl公开.DependencyProperty SearchRangeRange

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包含两个不同的属性,MinimumMaximum,它实现了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属性,以便读取其内部值(MinimumMaximum),因为这些必须在内部处理并仅由我的CustomControl. 绑定目标应在SearchRange属性或其内部道具(MinimumMaximum)发生任何变化后更新,而无需重新分配整个SearchRange. 或者,我应该允许直接绑定到内部属性(SearchRange.MinimumSearchRange.Maximum)。

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

提前致谢。

4

1 回答 1

0

最小值和最大值应该有两个依赖属性,注册一个属性更改回调。然后,在此回调中,您可以从新值构造一个范围并SetCurrentValue在范围属性上使用(这使绑定保持不变)。您还可以为使用 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);
}
于 2012-08-29T14:06:36.540 回答