включить кнопку на основе видимости поля со списком с помощью триггера

Я пытаюсь включить кнопку на основе видимости поля со списком и ее выбранного значения с использованием триггера с несколькими данными, но, похоже, не работает.

любая помощь оценена, пожалуйста.

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

первое условие не работает. Даже если поле со списком свернуто, кнопка неактивна.

Я хочу, чтобы кнопка была активна, когда поле со списком отображается и выбрано значение.


person Virus    schedule 11.07.2014    source источник
comment
Я думаю, вам следует опубликовать больше кода, трудно сказать, в чем проблема, например, где вы размещаете MultiDataTrigger ?, почему вам нужно использовать здесь ElementName для привязки, похоже, у вас задействовано более 1 ComboBox .. ..   -  person King King    schedule 11.07.2014
comment
Я помещаю этот триггер в кнопку, которую хочу включить. Я использую имя элемента, потому что хочу активировать его на основе выбранного значения поля со списком и его видимости. И задействовано только одно поле со списком.   -  person Virus    schedule 11.07.2014
comment
Только что сделал демонстрацию, похоже, работает нормально, изначально кнопка отключена (потому что SelectedValue имеет значение null), после выбора значения кнопка включена. Нажатие кнопки устанавливает Visibility для ComboBox в Collapsed или Hidden, и он по-прежнему включен (не отключен, как вы сказали).   -  person King King    schedule 11.07.2014
comment
Также я полагаю, что вы неправильно ввели некоторые ключевые слова (размещенные здесь, но не в вашем фактическом коде), которые должны быть чувствительны к регистру, например Multidatatrigger должно быть MultiDataTrigger.   -  person King King    schedule 11.07.2014


Ответы (2)


Проблема в том, что MultiDataTrigger оценивается в режиме AND, поэтому для того, чтобы быть оцененным как истинное, должны быть выполнены все условия.

когда комбо свернуто, первое условие не выполняется, следовательно, весь триггер оценивается как ложный. следовательно, оставив кнопку включенной.

чтобы решить эту проблему, добавьте еще один триггер, чтобы отключить кнопку, если комбо свернуто

Итак, вот полный пример достижения того же

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

Я обернул все необходимые элементы управления в панель стека, а затем использовал триггеры в стиле кнопок для управления тем же

поэтому, как упоминалось в вопросе, если все условия оцениваются как истинные, кнопка становится отключенной.

также, если комбо свернуто, кнопка останется неактивной.

вы можете настроить условия в соответствии с вашими потребностями

результат

результат

person pushpraj    schedule 11.07.2014
comment
OP не нуждается в демонстрации, он хочет знать, почему она не работает. Вы должны хотя бы объяснить что не так с его кодом, я также только что сделал демо, и, похоже, он работает нормально, а это значит, что с кодом OP все в порядке. если в его коде нет чего-то еще, что не было опубликовано. - person King King; 11.07.2014

Ваш код работает нормально, по крайней мере, после того, как он был отредактирован, чтобы стать действительным. Он делает именно то, что вы от него хотите. Возможно, у вас есть какой-то другой код, который мешал ему, но если вы протестируете это самостоятельно, вы увидите, что он работает:

<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>
person Sheridan    schedule 11.07.2014