【问题标题】:WPF Limit number of checked rows in datagridviewcheckboxcolumnWPF限制datagridviewcheckboxcolumn中检查的行数
【发布时间】:2012-05-11 11:35:26
【问题描述】:

在 DataGrid 中,我显示了一个包含属性 IsEnabled 的项目列表,该属性由 datagridviewcheckbox 列表示。 我想将同时检查的复选框数量限制为 5 个。

我该怎么做?

编辑:

我现在正在做的是使用多重绑定:转换器接受项目对象的“IsEnabled”属性并将项目列表本身作为输入值。

<DataGrid ItemsSource="{Binding MyItems}" AutoGenerateColumns="false" 
                  CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserSortColumns="false">
        <DataGrid.Columns>
          <DataGridCheckBoxColumn Header="" Binding="{Binding Path=IsEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <DataGridCheckBoxColumn.CellStyle>
              <Style>
                <Setter Property="CheckBox.IsEnabled" >
                  <Setter.Value>
                    <MultiBinding Converter="{Utilities:MyConverter}">
                      <Binding Path="IsEnabled" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
                      <Binding Path="DataContext.MyItems" RelativeSource="{RelativeSource AncestorType=UserControl}"/>
                    </MultiBinding>
                  </Setter.Value>
                </Setter>
             </Style>
            </DataGridCheckBoxColumn.CellStyle>
          </DataGridCheckBoxColumn>
...

MyConverter 中的转换函数如下所示:

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
  var val1 = (bool)values[0];
  int numSelected = 0;

  if (values[1] != null && values[1] is ObservableCollection<MyTestItem>)
  {
    var list = (ObservableCollectionBase<MyTestItem>)values[1];
    foreach (MyTestItem mti in list)
    {
      if (mti.IsEnabled)
        numSelected++;
    }
  }
  else
  {
    return false;
  }

 return val1 ? val1 : (numSelected < 5);
}

这按预期工作(不能同时选择超过 5 个复选框,所有其他复选框都被禁用),但我不断收到如下警告:

System.Windows.Data Warning: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.UserControl', AncestorLevel='1''. BindingExpression:Path=DataContext.MyItems; DataItem=null; target element is 'DataGridCell' (Name=''); target property is 'IsEnabled' (type 'Boolean')

我还尝试设置数据网格名称并在绑定中使用“ElementName”,但我不断收到相同的警告,尽管行为是正确的。

为什么我会收到这些警告?

【问题讨论】:

    标签: wpf binding datagrid checkbox multibinding


    【解决方案1】:

    在每个项目的 ctr 中传递集合。如果当前集合有 5 个 IsEnabled = true,则在 IsEnabled 属性上拒绝 True。

    【讨论】:

      【解决方案2】:

      为复选框选中事件添加一个事件处理程序。检查底层数据源的记录,看看有多少条记录已经被检查,如果超过5条记录,则取消检查的事件。

      【讨论】:

      • 谢谢,但我想通过绑定来解决这个问题,因为我使用的是 MVVM。所以在后面的代码中使用检查的事件处理程序不是我想要的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-26
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 1970-01-01
      • 2016-01-13
      • 2010-10-14
      相关资源
      最近更新 更多