コントロールが 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 が呼び出されることを期待しています。