【问题标题】:enable button based on combo box visibility using trigger使用触发器基于组合框可见性启用按钮
【发布时间】:2014-09-01 16:39:13
【问题描述】:

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

请提供任何帮助。

<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放在哪里,为什么你必须在这里使用一个ElementName来进行Binding,看起来就像你有超过 1 个 ComboBox 涉及....
  • 我将此触发器放在我要启用的按钮中。我正在使用元素名称,因为我想根据组合框选择的值及其可见性来触发它。并且它只涉及一个组合框。
  • 刚做了一个demo,看起来效果不错,最初Button是禁用的(因为SelectedValue为null),选择一个值后,Button是启用的。单击按钮将组合框的Visibility 设置为CollapsedHidden,并且它仍然处于启用状态(不是您所说的禁用)。
  • 另外我想你打错了一些关键字(张贴在这里,但不是在你的实际代码中),这些关键字应该区分大小写,例如Multidatatrigger应该是MultiDataTrigger

标签: wpf xaml combobox datatrigger


【解决方案1】:

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

当组合被折叠时,第一个条件失败,因此整个触发器评估为假。因此启用按钮。

为了解决这个问题,如果组合被折叠,请添加另一个触发器以禁用按钮

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

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

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

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

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

您可以根据需要调整条件

结果

【讨论】:

  • OP不需要演示,他想知道为什么它不起作用。您至少应该用他的代码解释 what's wrong,我也刚刚做了一个演示,它似乎工作正常,这意味着 OP 的代码没有任何问题除非他的代码有其他没有发布的东西。
【解决方案2】:

您的代码可以正常工作,至少在经过编辑使其有效后可以正常工作。它完全符合您的要求。也许您有一些其他代码干扰了它,但如果您自己测试它,您会发现它确实工作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 2016-12-16
    • 1970-01-01
    • 2019-07-16
    • 2017-12-28
    • 1970-01-01
    • 2021-01-22
    • 2012-05-29
    相关资源
    最近更新 更多