【发布时间】:2017-02-15 08:55:00
【问题描述】:
当我有一个包含控件B 的控件A 时,会继承一些属性Prop。这意味着,B.Prop 将自动采用 A.Prop 的值如果 B.Prop 未明确设置。据我所知,IsEnabled 就是这样一个属性。
现在我确实设置了B.IsEnabled 的值,但它仍然被A.IsEnabled 的值覆盖。 为什么会这样,我该如何纠正?
在这种情况下,A 是 StackPanel,B 是 TextBox:
<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 sn-p 将其 DataContext 设置为我的 ViewModel。 ViewModel 包含一个属性InDisableMode,它是一个bool。当它是false 时,一切正常:StackPanel 已启用,TextBox 已禁用。
但是当InDisableMode 是true 时,StackPanel 和 TextBox 都被禁用,尽管两个触发器都应该触发!
注意:我知道我可以在两个控件中将 IsEnabled 数据绑定到 InDisableMode(直接在 TextBox 中,在 StackPanel 中使用补码转换器)。我还没有尝试过这是否可行,因为无论如何我都想用触发器来做到这一点。
编辑:
禁用 StackPanel 的目的是轻松禁用它的所有子项(除了我要启用的 TextBox)。在不改变父子关系或创建新控件的情况下如何解决此任务的任何其他想法?目前,我看到的唯一方法是逐个禁用除 TextBox 之外的所有子项...
【问题讨论】:
标签: c# wpf inheritance properties triggers