0

DataGrid では、datagridviewcheckboxcolumn で表されるプロパティ IsEnabled を含むアイテムのリストを表示します。同時にチェックするチェックボックスの数を 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 内の convert 関数は次のようになります。

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

チェックボックスがオンになっているイベントにイベントハンドラーを追加します。基になるデータソースのレコードをチェックして、すでにチェックされている数を確認し、5レコードを超える場合は、チェックされたイベントをキャンセルします。

于 2012-05-11T17:44:54.720 に答える
0

各アイテムの ctr でコレクションを渡します。IsEnabled プロパティで、現在のコレクションに 5 つの IsEnabled = true がある場合、True を拒否します。

于 2012-05-11T13:38:05.400 に答える