2012-05-11 3 views
0

В DataGrid Я показываю список элементов, которые содержат свойство IsEnabled, которое представлено столбцом datagridviewcheckbox. Я хочу ограничить количество флажков, которые необходимо проверить, в то же время до 5.WPF Ограничить количество проверочных строк в datagridviewcheckboxcolumn

Как я могу это сделать?

Edit:

Что я делаю сейчас использует MultiBinding: преобразователь принимает свойство «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> 
... 

Конвертирование функция в MyConverterlooks так:

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') 

Я также попытались установить имя DataGrids и использовать «ELEMENTNAME» в связывании, но я получаю то же предупреждение, хотя поведение является правильным.

Зачем я получаю эти предупреждения?

ответ

0

В ctr каждому изделию проходит сбор. Свойство IsEnabled отклоняет True, если текущая коллекция имеет значение 5 IsEnabled = true.

0

Добавить обработчик события к флажку отмеченного события. Проверьте записи базового источника данных, чтобы узнать, сколько из них уже проверено, и отмените отмеченное событие, если оно больше 5 записей.

+0

Спасибо, но я хотел бы решить это через привязку, так как я использую MVVM. Поэтому использование обработчика отмеченного события в коде позади не то, что я ищу. – tabina

Смежные вопросы