【问题标题】:How to allow read-only binding to the internal properties of a custom control DependencyProperty?如何允许只读绑定到自定义控件 DependencyProperty 的内部属性?
【发布时间】:2012-08-29 13:58:58
【问题描述】:

我正在开发一个CustomControl,它公开了DependencyProperty 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 类包含两个不同的属性,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)。

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

提前致谢。

【问题讨论】:

  • 你试过什么?您应该能够像绑定到任何其他属性一样直接绑定到这些属性;您是否遇到了特殊问题,或者您不知道如何使用数据绑定?

标签: c# wpf binding dependency-properties


【解决方案1】:

最小值和最大值应该有两个依赖属性,注册一个property changed callback。然后,在此回调中,您可以从新值构造一个范围并在范围属性上使用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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-27
    • 2011-06-24
    • 2011-05-11
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多