C# WPF:IsEnabled=false的ComboBoxItem的ItemTemplate中的可单击按钮
尝试设置WPF组合框; 它的某些项不应该是可选的,因此我将绑定IsEnabled到基础项的某些属性 同时,我需要定义一个包含按钮的ItemTemplate。 该按钮需要可点击,即使该项目不可选择,但点击该按钮当然不应选择该项目;它将触发一个执行一些后台操作的命令,这将最终使基础项可选择 但是,当ComboBoxItem.IsEnabled=false时,似乎连按钮都会自动禁用 简要示例:C# WPF:IsEnabled=false的ComboBoxItem的ItemTemplate中的可单击按钮,c#,wpf,C#,Wpf,尝试设置WPF组合框; 它的某些项不应该是可选的,因此我将绑定IsEnabled到基础项的某些属性 同时,我需要定义一个包含按钮的ItemTemplate。 该按钮需要可点击,即使该项目不可选择,但点击该按钮当然不应选择该项目;它将触发一个执行一些后台操作的命令,这将最终使基础项可选择 但是,当ComboBoxItem.IsEnabled=false时,似乎连按钮都会自动禁用 简要示例: <ComboBox ItemsSource="{Binding Items}">
<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中定义一个按钮,该按钮无论如何都保持可单击状态
谢谢当您删除ComboBox.ItemContainerStyle时,您可以设置DataTemplate中每个元素的IsEnabled属性
组合框项目仍将启用,但文本块将被禁用。
绑定只是一个例子。取决于您的IsEnabled属性所在的位置。在我的示例中,属性位于viewmodel中,它是窗口的DataContext。为了将来的参考,我们根据以下答案找到了另一种方法: 因此,基本上创建一个从button派生的类,该类重写默认的IsEnabled行为
好处是,这似乎正是我所期待的,但它确实改变了WPF的一个优点。。默认行为,因此可能需要小心一点将ComboBoxItem设置为disabled将禁用其所有内容。如果合适的话,可以取消SelectionChanged事件,而不是禁用它。这样,无论文本块的状态是禁用的,都可以选择该项吗?我现在不能测试,谢谢。@该死的,是的…很好。据我所知,没有其他方法来启用按钮;正如你在另一条评论中提到的,如果活动建议可行,你的回答仍然有用。您仍然希望文本被禁用或至少看起来被禁用。@是的,这就是我没有删除答案的原因。也许它仍然符合提问者的要求。谢谢你们两个!尽可能避免在视图中出现代码隐藏,这可能是一个无用的习惯,但在这种情况下,看到这似乎是最好或唯一的方法,这将支持您提出的想法。谢谢
<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>