コントロールB
を含むコントロールA
がある場合、継承されるプロパティーはProp
です。つまり、B.Prop
が明示的にに設定されていない場合、B.Prop
は自動的にA.Prop
の値を取ります。私の知る限り、IsEnabled
はこのようなプロパティです。明示的に設定されていても、親によってプロパティ値がオーバーライドされます
今私はB.IsEnabled
の値を明示的に設定していて、それでもA.IsEnabled
の値で上書きされている状況があります。 それはなぜですか、どうすれば修正できますか?このような状況A
で
はStackPanelのであるとB
テキストボックス:
<StackPanel>
<StackPanel.Style>
<Style TargetType="StackPanel">
<Setter Property="IsEnabled" Value="True"/>
<Style.Triggers>
<DataTrigger Binding="{Binding InDisableMode}" Value="True">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
<TextBox Text="some text">
<TextBox.Style>
<Style TargetType="TextBox">
<Setter Property="IsEnabled" Value="False"/>
<Style.Triggers>
<DataTrigger Binding="{Binding InDisableMode}" Value="True">
<Setter Property="IsEnabled" Value="True"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
</StackPanel>
上記のXAMLのスニペットはそのDataContextのが私のViewModelに設定されています。 ViewModelには、bool
のプロパティInDisableMode
が含まれています。 false
の場合、すべてが期待どおりです。StackPanelが有効で、TextBoxが無効です。
InDisableMode
がtrue
の場合、両方のトリガーはトリガーする必要がありますが、StackPanelとTextBoxの両方が無効になります。
注:両方のコントロール(TextBox内で、補完コンバータを使用してStackPanelで直接)のIsEnabled
〜InDisableMode
をデータバインドできることはわかっています。とにかくこれをTriggersでやってみたいので、これがうまくいくと私は試していません。
EDIT:のStackPanelを無効にする
ポイントは(私が代わりに使用可能にしたいテキストボックスを除く)簡単にその子のすべてを無効にすることです。親子関係を変更したり、新しいコントロールを作成したりせずにこのタスクを解決する方法は他にもありますか?現時点では、私が見る唯一の方法は、TextBoxを除くすべての子を無効にすることです。
"これは、UIElement.IsEnabledプロパティが親からの値を継承して値強制を使用するためです。 - しかし、子が親から常にその値を継承する場合、親を有効にして子を無効にすることは可能ですか? – Kjara
@Kjara継承と上書きは2つの違いがあります。強制は、デフォルトの動作を上書きすることを意味します。 Label.FontSize = 20は、その中のすべてのテキストブロックのフォントサイズを変更しますが、FontSizeを特定のフォントサイズに設定すると、それが尊重されます。 – AnjumSKhan