2013-10-04 2 views
4

У меня есть DataGrid с DataGridCheckBoxColumn. Сетка имеет привязку со списком объектов. Я хочу, чтобы, если флажки отмечены N, флажок отключен, но я не знаю, как выполнить отключение.wpf datagridcheckboxcolumn: как включить/отключить флажки

<DataGridCheckBoxColumn 
    x:Name="IsFixedByBracketColumn" 
    Header="Fissato con staffa" 
    Binding="{Binding isFixedByBracket, UpdateSourceTrigger=PropertyChanged}" 
    IsReadOnly="False"> 
    <DataGridCheckBoxColumn.ElementStyle> 
     <Style TargetType="CheckBox"> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition 
          Binding="{Binding 
           HasMaxNumberReached, 
           RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
          Value="true"/> 
         <Condition 
          Binding="{Binding 
           IsChecked, 
           RelativeSource={RelativeSource Self}}" 
          Value="false"/> 
        </MultiDataTrigger.Conditions> 
        <Setter Property="IsEnabled" Value="False"/> 
       </MultiDataTrigger> 
      </Style.Triggers> 
      <EventSetter 
       Event="CheckBox.Checked" 
       Handler="DataGridCheckBoxColumn_Checked" /> 
     </Style> 
    </DataGridCheckBoxColumn.ElementStyle>           
</DataGridCheckBoxColumn> 

Код для события:

private void DataGridCheckBoxColumn_Checked(object sender, RoutedEventArgs e) 
{ 
    CheckBox cb = (CheckBox)sender; 
    if (cb.IsChecked == true) 
    { 
     this.numberOfCheckboxesChecked++; 
    } 
    else 
    { 
     this.numberOfCheckboxesChecked--; 
    } 

    if (this.numberOfCheckboxesChecked >= maxNumOfPointsPerSide) 
    {    
     this.HasMaxNumberReached = true; 
    } 
    else 
    { 
     this.HasMaxNumberReached = false; 
    }    
} 

public bool HasMaxNumberReached 
{ 
    get { 
     return hasMaxNumberReached; 
    } 
    set { 
     hasMaxNumberReached = value; 
     RaisePropertyChanged("HasMaxNumberReached"); 
    } 
} 

ответ

2

Благодаря Магнусу в MSDN Форуме здесь правильный ответ на проблему:

<DataGrid x:Name="grid" AutoGenerateColumns="False"> 
     <DataGrid.Resources> 
      <Style TargetType="CheckBox" x:Key="style"> 
       <Style.Triggers> 
        <MultiDataTrigger> 
         <MultiDataTrigger.Conditions> 
          <Condition Binding="{Binding HasMaxNumberReached, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" Value="true"/> 
          <Condition Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="false"/> 
         </MultiDataTrigger.Conditions> 
         <Setter Property="IsEnabled" Value="False"/> 
        </MultiDataTrigger> 
       </Style.Triggers> 
       <EventSetter Event="CheckBox.Checked" Handler="DataGridCheckBoxColumn_Checked" /> 
       <EventSetter Event="CheckBox.Unchecked" Handler="DataGridCheckBoxColumn_Checked" /> 
      </Style> 
     </DataGrid.Resources> 
     <DataGrid.Columns> 
     <DataGridCheckBoxColumn x:Name="IsFixedByBracketColumn" Header="Fissato con staffa" 
           Binding="{Binding isFixedByBracket, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False" 
           ElementStyle="{StaticResource style}" EditingElementStyle="{StaticResource style}"> 

     </DataGridCheckBoxColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

Here полная тема

+0

Два года спустя я хочу сказать спасибо, потому что это решило другую проблему, которую я испытывал. DataGrid.Столбцы не являются частью дерева проектирования в WPF, поэтому, когда у вас есть привязки, например, на клетке checkbox, вы не можете выполнять поиск RelativeSource AncestorType, скажем ... в главном окне. Таким образом, вы не можете привязываться к datacontext окна, вы должны привязываться к datacontext datagrid, который может быть различным в определенных ситуациях. ОДНАКО Ваше решение по стилю в ресурсах datagrid позволяет относительному источнику быть привязанным к окну, поэтому столбец флажка теперь может привязываться к нему через прокси-сервер! – user99999991

0

вы можете установить DataGridCheckBoxColumn.ElementStyle для включения/выключения ячейки, как описано ниже. Здесь предполагается, что HasMaxNumberReached является свойством в ViewModel, который сообщает, что установлен флажок check max.

<DataGrid> 
     <DataGrid.Columns> 
      <DataGridCheckBoxColumn> 
       <DataGridCheckBoxColumn.ElementStyle> 
        <Style TargetType="Checkbox"> 
         <Style.Triggers> 
          <MultiDataTrigger> 
           <MultiDataTrigger.Conditions> 
            <Condition Binding="{Binding HasMaxNumberReached, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" Value="true"/> 
            <Condition Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="false"/> 
           </MultiDataTrigger.Conditions> 
           <Setter Property="IsEnabled" Value="False"/> 
          </MultiDataTrigger>        
         </Style.Triggers> 
         <EventSetter 
           Event="CheckBox.Checked" 
           Handler="DataGridCheckBoxColumn_Checked" /> 
         <EventSetter 
        </Style> 
       </DataGridCheckBoxColumn.ElementStyle> 
      </DataGridCheckBoxColumn> 
     </DataGrid.Columns> 
    </DataGrid> 



private bool hasMaxNumberReached; 
public bool HasMaxNumberReached 
{ 
    get 
    {return hasMaxNumberReached;} 
    set 
    { 
     hasMaxNumberReached =value; 
     RaisePropertyChanged("HasMaxNumberReached"); 
     } 
    } 
+0

, поэтому ничего не нужно делать по коду (исключая управление HAsMaxNumberReached)? – FrancescoDS

+0

, но таким образом отключить только неконтролируемый? – FrancescoDS

+0

Я пробовал код. TargetType = «DataGridCell» не работает, вызывает исключение. Если я изменю его на CheckBox, событие CellEditEnding не будет запущено ... – FrancescoDS

0

Да, вы можете сделать это с помощью Triggers, как этого

<Style x:Key="MyCheckBoxStyle" TargetType="{x:Type CheckBox}"> 
<Style.Triggers> 
    <Trigger Property="IsChecked" Value="False"> 
    <Setter Property="IsEnabled" Value="False" /> 
</Trigger> 
</Style.Triggers> 

и вы можете применить этот стиль к вашему флажку

+0

добавление стилей изменяет поведение флажков в моей колонке datagridcheckbox ... все флажки не центрированы, но после двойного щелчка на контейнере ячеек они возвращаются волшебным образом в центр ячейки ... пока я выбираю другую ячейку. – FrancescoDS

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