【问题标题】:Select a checkbox in a ListView with one click一键选中 ListView 中的复选框
【发布时间】:2017-10-25 18:25:36
【问题描述】:

在我的 WPF 程序中,我有一个 ListView 和一个带有 checkbox 的列:

    <ListView>
      <ListView.View>
        <GridView>
          <GridViewColumn Header="Checkbox-Column">            
            <GridViewColumn.CellTemplate>
              <DataTemplate>
                <Border BorderThickness="2" BorderBrush="AntiqueWhite">
                  <CheckBox IsChecked="{Binding Status}" />
                </Border>
              </DataTemplate>
            </GridViewColumn.CellTemplate>
          </GridViewColumn>
        </GridView>
      </ListView.View>
   </ListView>

当用户点击一个复选框时,它应该立即改变它的状态。但实际上,用户需要两次点击。第一次单击选择行(或将其置于“编辑模式”,尽管我不确定),然后第二次单击更改复选框状态。

如何强制复选框在第一次单击时更改?

编辑:这种行为的原因是,我使用bool? 而不是bool 来绑定复选框。该属性的初始值是null(它必须是),所以第一次单击将值更改为false,并将second 更改为true(这就是控件似乎没有反应的原因第一次点击)。
所以 - 问题应该是:如何强制控件从 null 更改为 true 而不是 false

提前致谢,
弗兰克

【问题讨论】:

  • 我无法重现您的问题。第一次点击时哪个控件被聚焦?
  • 我玩了一下它并意识到,这种行为的原因是使用了布尔值?而不是绑定复选框的布尔值(请参阅我编辑的问题)

标签: wpf listview checkbox


【解决方案1】:

如何强制控件从null 更改为true 而不是false

在视图中编写一些代码,将IsChecked 属性第一次设置为true 时设置为false

private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
    var cb = e.Source as CheckBox;
    cb.IsChecked = true;
    cb.Unchecked -= CheckBox_Unchecked;
}

private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
    var cb = e.Source as CheckBox;
    cb.IsThreeState = false;
}

<CheckBox IsChecked="{Binding Status}" IsThreeState="True"
          Checked="CheckBox_Checked"
          Unchecked="CheckBox_Unchecked"/>

【讨论】:

  • 几乎做到了!如果我没有将 IsThreeState 设置为 true(我不需要用户的第三个状态,因为 null 在我的上下文中的含义是,用户没有与行交互),重复单击复选框导致以下行为:null(初始值) » true » true » false » true » false » true ...因此,第二次单击应将复选框更改为 false,但仍为 true。之后,它按预期切换。知道是什么原因造成的吗?
  • 在 XAML 中将 IsThreeState 属性设置为 true,并在事件处理程序中将其设置回 false。
  • 当 IsThreeState 为 true 时,State 似乎从 Null 变为 true。所以解决方案是订阅 Checked 事件并在处理程序中将 IsThreeState 设置为 false。非常感谢您帮助我解决这个问题! :)
  • 不客气。如果您的原始问题已解决,请记住接受答案并投票:stackoverflow.com/help/someone-answers
  • 当您根据我们的发现对其进行编辑时,我很乐意接受您的回答,以反映解决方案,而无需通过 cmets。
【解决方案2】:

您必须将CheckBox(也可能是您的Border)的VerticalAlignmentHorizontalAlignment 设置为Stretch

这是在大多数控件上默认完成的,但有可能您要么通过显式样式覆盖它,要么你的 ListView 默认为其子控件覆盖它(不确定它的行为方式)。

【讨论】:

  • 这应该如何影响需要两次单击来选择/取消选择复选框的行为?
  • 它不应该这样工作。您必须在其他地方定义一些其他样式,以覆盖控件的默认行为。您可以尝试通过使用键创建一个空样式并将其分配给您的控件来检查它。然后它将覆盖您的应用程序中为此控件完成的所有其他样式(您可能会看到您的样式设置为应用于给定类型的控件,这就是为什么您可能看不到它明确分配,但它仍然有效)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2011-02-10
  • 1970-01-01
相关资源
最近更新 更多