Почему IsChecked не меняет эту кнопку переключения?
У меня есть следующий 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 ответа
Я попробовал твой 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
Исправили это путем параметризации моей команды, привязки к новому свойству в моей viewmodel и перемещения 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!
Просто предположение, но удалите привязку Mode=OneWay
и попробуй еще раз.