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の 2 つの異なるプロパティが含まれて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を読み取るためにのみプロパティにバインドできる必要があります。これらは内部で処理され、 my によって設定される必要があるためです。バインディング ターゲットは、プロパティまたはその内部 props ( and )のいずれかに変更が加えられた後、全体を再割り当てせずに更新する必要があります。または、内部プロパティ (および)に直接バインドすることを許可する必要があります。MinimumMaximumCustomControlSearchRangeMinimumMaximumSearchRangeSearchRange.MinimumSearchRange.Maximum

この結果を達成するためにさまざまな方法を試しましたが、どれも成功しませんでした。どうすれば必要な結果を得ることができますか?

前もって感謝します。

4

1 に答える 1

0

最小値と最大値の 2 つの依存関係プロパティが必要です。プロパティを変更した callbackを登録します。このコールバックでは、新しい値から範囲を構築SetCurrentValueし、範囲プロパティで使用できます (これにより、バインディングはそのまま維持されます)。SetCurrentValue を使用して他の 2 つのプロパティを更新する range プロパティのコールバックを提供することもできます。

擬似コード:

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 に答える