Почему IsChecked не меняет эту кнопку переключения? - PullRequest
5 голосов
/ 06 января 2011

У меня есть следующий xaml для кнопки переключения:

<ToggleButton Margin="0,3" Grid.Row="3" Grid.ColumnSpan="2" Command="{Binding DataContext.SelectAllCommand, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
  <ToggleButton.Style>
   <Style TargetType="{x:Type ToggleButton}">
       <Setter Property="Content" Value="Select All"/>
       <Style.Triggers>
            <Trigger Property="IsChecked" Value="True">
                <Setter Property="Content" Value="Select None"/>
                <Setter Property="Command" Value="{Binding DataContext.SelectNoneCommand, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>
            </Trigger>
          </Style.Triggers>
      </Style>
  </ToggleButton.Style>
</ToggleButton>

Но свойство IsChecked никогда не обновляется при нажатии кнопки.

Если я использую snoop и принудительно устанавливаю IsChecked в True, то срабатывает триггер.

Ответы [ 3 ]

5 голосов
/ 06 января 2011

Я попробовал твой ToggleButton, и он работает нормально.Единственная проблема, которую я вижу с этим, состоит в том, что вы устанавливаете Command явно.Это должно быть сделано с Setter вместо этого (как вы сделали с Content), чтобы не сломать Trigger.

<ToggleButton Name="toggleButton" Margin="0,3" Grid.Row="3" Grid.ColumnSpan="2">
    <ToggleButton.Style>
        <Style TargetType="{x:Type ToggleButton}">
            <Setter Property="Content" Value="Select All"/>
            <Setter Property="Command"
                    Value="{Binding DataContext.SelectAllCommand,
                                    Mode=OneWay,
                                    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>
            <Style.Triggers>
                <Trigger Property="IsChecked" Value="True">
                    <Setter Property="Content" Value="Select None"/>
                    <Setter Property="Command" Value="{Binding DataContext.SelectNoneCommand, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ToggleButton.Style>
</ToggleButton>

Если вы все еще не можете нажать на него, я бы проверилесли IsHitTestVisible или подобное установлено на False дальше вверх по дереву визуалов.

Если вы хотите сравнить свою версию с моим тестовым приложением, чтобы увидеть, что не работает, я загрузил ее здесь: http://www.mediafire.com/?ik24ftsfw2wwfwb

2 голосов
/ 06 января 2011

Исправлено путем параметризации моей команды, привязки к новому свойству в моей view-модели и перемещения Command в стиль:

               <ToggleButton Margin="0,3" Grid.Row="3" Grid.ColumnSpan="2" IsThreeState="False" 
                            IsChecked="{Binding DataContext.IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
                    <ToggleButton.Style>
                        <Style TargetType="{x:Type ToggleButton}">
                            <Setter Property="Content" Value="Select All"/>
                            <Setter Property="Command" Value="{Binding DataContext.SelectAllCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>                                
                            <Style.Triggers>
                                <Trigger Property="IsChecked" Value="True">
                                    <Setter Property="Content" Value="Select None"/>                                
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </ToggleButton.Style>
                </ToggleButton>

Разве ты не любишь иногда WPF!

1 голос
/ 06 января 2011

Просто предположение, но удалите Привязку Mode=OneWay и повторите попытку.

...