Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:IsEnabled=false的ComboBoxItem的ItemTemplate中的可单击按钮_C#_Wpf - Fatal编程技术网

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

C# WPF:IsEnabled=false的ComboBoxItem的ItemTemplate中的可单击按钮,c#,wpf,C#,Wpf,尝试设置WPF组合框; 它的某些项不应该是可选的,因此我将绑定IsEnabled到基础项的某些属性 同时,我需要定义一个包含按钮的ItemTemplate。 该按钮需要可点击,即使该项目不可选择,但点击该按钮当然不应选择该项目;它将触发一个执行一些后台操作的命令,这将最终使基础项可选择 但是,当ComboBoxItem.IsEnabled=false时,似乎连按钮都会自动禁用 简要示例: <ComboBox ItemsSource="{Binding Items}">

尝试设置WPF组合框; 它的某些项不应该是可选的,因此我将绑定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中定义一个按钮,该按钮无论如何都保持可单击状态

谢谢

当您删除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>