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

时间:2014-07-11 06:17:02

标签: wpf xaml combobox datatrigger

我正在尝试启用基于组合框可见性的按钮及其使用多数据触发器选择的值,但似乎无法正常工作。

任何帮助表示赞赏。

<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"/>

第一个条件似乎不起作用。即使组合框已折叠,按钮也会被禁用。

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

2 个答案:

答案 0 :(得分:0)

问题是MultiDataTriggerAND模式下进行评估,因此为了评估为真,必须满足所有条件。

当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>

我已将所有必要的控件包装在堆栈面板中,然后使用按钮样式的触发器来控制相同的

如问题中所述,如果所有条件都评估为真,则该按钮将被禁用。

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

您可以根据需要调整条件

结果

result

答案 1 :(得分:0)

您的代码工作正常,至少在编辑后才能生效。它完全符合您的要求。也许你有其他一些干扰它的代码,但是如果你自己测试它,你会发现它 工作:

<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>