2

コントロールが Grid 型の先祖から UIElement.IsEnabledProperty を継承する必要があります (オプションで Window またはグリッドをラップできるその他の要素)

CS: 以下では、UIElement.IsEnabledProperty のメタデータをオーバーライドし、Change および Coerce デリゲートで設定します。

    static PipeControl()
    {
        PipeControl.IsEnabledProperty.OverrideMetadata(typeof(PipeControl), new FrameworkPropertyMetadata(false, OnIsEnabledPropertyChanged, OnIsEnabledPropertyCoerce));
    }

    private static void OnIsEnabledPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var isEnabled = (bool)e.NewValue;
    }

    private static object OnIsEnabledPropertyCoerce(DependencyObject d, object baseValue)
    {
        var valueSource = DependencyPropertyHelper.GetValueSource(d, PipeControl.IsEnabledProperty);

        var pipeContorl = d as PipeControl;
        if (pipeContorl == null) return baseValue;

        return (bool)baseValue && pipeContorl.IsMyPipe;
    }

XAML :

    <Grid IsEnabled="{Binding IsMyCondition , Mode=OneWay}">        
         <game:PipeControl Grid.Row="2"  />            
         <game:PipeControl  Grid.Row="2" Grid.Column="1" />
    </Grid> 

IsMyCondition が変更されるたびに OnIsEnabledPropertyCoerce が各 PipeContorl で呼び出され、 OnIsEnabledPropertyChanged が呼び出されることはありません。

Inheritance を使用する必要がある方法で何かを見逃したに違いありません。値のソースが「継承」され、 OnIsEnabledPropertyChanged が呼び出されることを期待しています。

4

2 に答える 2

2

上記のAdnanの回答と、この回答:

既存の依存関係プロパティのコールバックにロジックを追加するにはどうすればよいですか?

私は完全な答えを構成しました。

CS :

    static PipeControl()
    {
        PipeControl.IsEnabledProperty.OverrideMetadata(typeof(PipeControl), new UIPropertyMetadata(new PropertyChangedCallback(OnIsEnabledPropertyChanged)));
    }



    private static void OnIsEnabledPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {           
        var isEnabled = (bool)e.NewValue;
    }


    protected override bool IsEnabledCore
    {
        get
        {
            return (base.IsEnabledCore && IsMyPipe);
        }
    }

IsEnabledCore は値を Callback に返すため、そこで強制が発生し、次に CallBack が発生します。

参考までに、ローカルのデフォルト値を設定すると、継承された値がオーバーライドされるように見えるため、継承されたプロパティのメタデータをオーバーライドすると、次のようにデフォルトのローカル値が与えられます。

  PipeControl.IsEnabledProperty.OverrideMetadata(typeof(PipeControl), new UIPropertyMetadata(false,new PropertyChangedCallback(OnIsEnabledPropertyChanged)));   

さらに、強制ロジックのみを追加する必要がある場合は、IsEnabledCore をオーバーライドするだけで、IsEnabledProperty のメタデータに対して他に何もする必要はありません。

于 2013-04-10T18:25:49.390 に答える