尝试设置WPF ComboBox
;
它的某些项目不应该是可选择的,因此我将IsEnabled
绑定到基础项目的某些属性。
同时,我需要定义一个ItemTemplate
,其中包含例如一个按钮。
这个按钮需要是可点击的,即使该项目不可选择(单击该按钮也不值得选择该项目当然;它将触发执行某些后台操作的命令,这最终会使基础项目可选择)
然而,当ComboBoxItem.IsEnabled = false
时,甚至按钮自动被禁用。
简要示例:
<ComboBox ItemsSource="{Binding Items}">
<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="IsEnabled" Value="{Binding CanSelectItem}"/>
</Style>
</ComboBox.ItemContainerStyle>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"/>
<!-- This button isn't clickable when ComboBoxItem.IsEnabled = false .. but it should be! -->
<Button Content="Click me" Command="{Binding SomeCmd}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
有没有办法绕过这个?例如,将一些项目设置为不可选择,但是在ItemTemplate
中定义一个按钮,无论如何都可以点击?
由于
答案 0 :(得分:1)
删除ComboBox.ItemContainerStyle
后,您可以设置IsEnabled
DataTemplate
属性
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"
IsEnabled="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.IsEnabled}"/>
<Button Content="Click me" Command="{Binding SomeCmd}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
组合框项仍将启用,但TextBlock
将被禁用。
绑定只是一个例子。取决于IsEnabled
财产的位置。在我的示例中,属性位于view DataContext
的{{1}}视图模型中。
答案 1 :(得分:0)
为了将来的参考,基于这个答案找到了另一种方法:
WPF override IsEnabled from Parent
所以基本上创建一个派生自按钮的类,它会覆盖默认的IsEnabled行为。
好处是这似乎完全符合我的要求,但它确实改变了WPF的一个漂亮的默认行为,所以可能需要小心谨慎