为什么这个切换按钮的IsChecked属性不会改变?

5

我有以下用于切换按钮的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,则触发器会启动。


1
你的命令是做什么的?如果我移除你的命令(只设置内容属性),它就能正常工作。 - Wonko the Sane
3个回答

6

我尝试了您的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

啊,无法访问 - 公司防火墙阻止了它!还是谢谢你的帮助。 - cjroebuck

3

我通过将命令参数化、绑定到我的视图模型的新属性并将命令移动到样式中来解决了这个问题:

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


WPF太棒了! - Ferid Š. Sejdović

1
只是猜测,但是尝试移除绑定Mode=OneWay然后再试一次。

谢谢,但没有运气。我需要绑定一些东西到IsChecked属性才能让它工作吗? - cjroebuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接