Когда у меня есть элемент управления A
, который содержит элемент управления B
, есть свойства Prop
, которые наследуются. Это означает, что B.Prop
автоматически примет значение A.Prop
, если B.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 содержит свойство InDisableMode
, которое является bool
. Когда это false
, все будет как и ожидалось: StackPanel включен и TextBox отключен.
Но когда InDisableMode
является true
, оба StackPanel и TextBox отключены, хотя оба триггера должны запускаться!
Примечание: Я знаю, что я могу привязатьк InDisableMode
в обоих элементах управления (в TextBox напрямую, в StackPanel с помощью конвертера дополнений). Я не пробовал, если это работает, так как я хочу сделать это с помощью триггеров.
EDIT:
Точка отключения StackPanel является отключение всех своих детей легко (кроме TextBox, который я хочу, чтобы включить вместо него). Любые другие идеи, как решить эту задачу без изменения отношений родитель-потомок или создания новых элементов управления? На данный момент единственный способ, который я вижу, - отключить всех детей, кроме TextBox, один за другим ...
«Это происходит потому, что свойство UIElement.IsEnabled использует принудительное значение ценности, наследуя значение от его родителя». - но если ребенок всегда наследует значение от своего родителя, почему возможно включить родительский элемент и отключить его? – Kjara
@ Kjara Наследование и переписывание - это два случая различий. Принуждение означает, что вы хотите переписать поведение по умолчанию. Label.FontSize = 20 изменяет шрифты всех текстовых блоков внутри него, но если вы установите FontSize для определенного, это будет соблюдаться. – AnjumSKhan