Wpf 使用触发器基于组合框可见性启用按钮

Wpf 使用触发器基于组合框可见性启用按钮,wpf,xaml,combobox,datatrigger,Wpf,Xaml,Combobox,Datatrigger,我试图使用multidata触发器启用基于组合框可见性及其选定值的按钮,但似乎不起作用 谢谢你的帮助 <Multidatatrigger.conditions> <Condition Binding="{Binding ElementName=ComboName, Path=Visibility}" Value="Visible"/> <Condition Binding="{Binding ElementName=ComboName, Pa

我试图使用multidata触发器启用基于组合框可见性及其选定值的按钮,但似乎不起作用

谢谢你的帮助

<Multidatatrigger.conditions>
<Condition
    Binding="{Binding ElementName=ComboName, Path=Visibility}"
    Value="Visible"/>
<Condition
    Binding="{Binding ElementName=ComboName, Path=SelectedValue}"
    Value="{x:Null}"/>
</Multidatatrigger.conditions>
<Setter
    Property = "IsEnabled",
    Value = "false"/>
第一个条件似乎不起作用。即使组合框被折叠,按钮也被禁用

我希望在组合框可见且选择了值时启用该按钮。

问题在于MultiDataTrigger在and模式下求值,因此要求值为true,必须满足所有条件

当combo折叠时,第一个条件失败,因此整个触发器的计算结果为false。因此,保持按钮处于启用状态

要解决这个问题,请添加另一个触发器,以便在组合框折叠时禁用按钮

所以这里有一个完整的例子来实现同样的目标

<StackPanel>
    <StackPanel.Resources>
        <BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
        <ObjectDataProvider x:Key="sampleData"
                            MethodName="GetValues"
                            ObjectType="{x:Type sys:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="Visibility" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </StackPanel.Resources>
    <CheckBox Content="Combo visibility"
              IsChecked="True"
              x:Name="check" />
    <ComboBox x:Name="ComboName"
              Visibility="{Binding IsChecked, ElementName=check,Converter={StaticResource BoolToVisConverter}}"
              ItemsSource="{Binding Source={StaticResource sampleData}}" />
    <Button Content="A button">
        <Button.Style>
            <Style TargetType="Button">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=ComboName, Path=Visibility}"
                                 Value="Collapsed">
                        <Setter Property="IsEnabled"
                                Value="false" />
                    </DataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding ElementName=ComboName, Path=Visibility}"
                                       Value="Visible" />
                            <Condition Binding="{Binding ElementName=ComboName, Path=SelectedValue}"
                                       Value="{x:Null}" />
                        </MultiDataTrigger.Conditions>
                        <Setter Property="IsEnabled"
                                Value="false" />
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
</StackPanel>
我已经将所有必要的控件包装在堆栈面板中,然后使用按钮样式的触发器来控制相同的控件

因此,如问题中所述,如果所有条件均为真,则按钮将被禁用

此外,如果组合被折叠,按钮将保持禁用状态

您可以根据需要调整条件

结果


您的代码工作得很好,至少在它被编辑为有效后是这样。它做的正是你想要它做的。也许您有其他一些代码干扰了它,但是如果您单独测试它,您将看到它确实有效:


我认为你应该发布更多的代码,很难说这里有什么问题,比如你把MultiDataTrigger放在哪里?为什么你必须在这里使用一个ElementName来绑定,看起来你有不止一个组合框…我把这个触发器放在我想启用的按钮中。我之所以使用元素名,是因为我想根据组合框的选定值及其可见性来触发它。而且它只涉及一个组合框。刚刚做了一个演示,似乎工作正常,最初按钮被禁用,因为SelectedValue为空,选择一个值后,按钮被启用。单击该按钮可将组合框的可见性设置为折叠或隐藏,并且它仍处于启用状态,而不是如您所说的禁用状态。此外,我认为您在此处输入了一些关键字,但在实际代码中没有输入,这些关键字应区分大小写,例如Multidatatrigger应为Multidatatrigger。OP不需要演示,他想知道为什么它不起作用。你至少应该解释一下他的代码出了什么问题,我刚刚做了一个演示,它似乎工作得很好,这意味着OP的代码没有任何问题,除非他的代码有其他未发布的东西。
<StackPanel>
    <ComboBox Name="Combo" ItemsSource="{Binding Items" />
    <Button Content="Click me">
        <Button.Style>
            <Style>
                <Style.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding Visibility, 
                                ElementName=Combo}" Value="Visible" />
                            <Condition Binding="{Binding SelectedValue, 
                                ElementName=Combo}" Value="{x:Null}" />
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Button.IsEnabled" Value="False" />
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
</StackPanel>