【问题标题】:Why won't IsChecked change on this toggle button?为什么 IsChecked 不会在此切换按钮上更改?
【发布时间】:2011-06-04 19:31:27
【问题描述】:

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

【问题讨论】:

  • 你的命令是做什么的?如果我删除您的命令(并且只设置内容属性,它工作正常。

标签: wpf togglebutton ischecked


【解决方案1】:

只是猜测,但请移除绑定 Mode=OneWay 并重试。

【讨论】:

  • 谢谢,但没有运气。我是否需要将某些东西绑定到 IsChecked 属性才能使其正常工作?
【解决方案2】:

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

【讨论】:

  • 啊,无法访问 - 公司防火墙阻止了它!不过感谢您的帮助
【解决方案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!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 2014-02-11
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多