0

在 DataGrid 中,我显示包含属性 IsEnabled 的项目列表,该属性由 datagridviewcheckboxcolumn 表示。我想将同时检查的复选框数量限制为 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”,但我不断收到相同的警告,尽管行为是正确的。

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

4

2 回答 2

0

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

于 2012-05-11T13:38:05.400 回答
0

将事件处理程序添加到复选框选中事件。检查底层数据源的记录以查看已检查的记录数,如果超过 5 条记录,则取消已检查的事件。

于 2012-05-11T17:44:54.720 回答