WPF:ComboBoxItem的ItemTemplate中的可单击按钮,IsEnabled = false

时间:2017-08-23 11:39:37

标签: c# wpf

尝试设置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中定义一个按钮,无论如何都可以点击?

由于

2 个答案:

答案 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的一个漂亮的默认行为,所以可能需要小心谨慎