2015-01-16 2 views
0

Здравствуйте, это моя проблема:DataGridRow.IsSelected установлен, и я не знаю, почему

Я получил два стиля определены в ресурсах для DataGridRow и DataGridCell:

<Style TargetType="{x:Type DataGridRow}"> 
     <Setter Property="DataGridRow.IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
    </Style> 
    <Style TargetType="{x:Type DataGridCell}"> 
     <Style.Triggers> 
      <Trigger Property="DataGridCell.IsSelected" Value="True"> 
       <Setter Property="Background" Value="LightSteelBlue" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

Я в принципе хочу ряд быть выделяется синим цветом, когда пользователь выбирает его.

У меня есть MessageWrapper и класс SignalWrapper. Каждый MessageWrapper имеет список SignalWrappers (который иногда может быть пустым). Таким образом, первый DataGrid для отображения всех MessageWrappers:

<DataGrid x:Name="messageGrid" 
          Grid.Column="0" 
          Margin="3" 
          AutoGenerateColumns="False" 
          CanUserAddRows="False" 
          HorizontalScrollBarVisibility="Hidden" 
          IsReadOnly="True" 
          ItemsSource="{Binding SelectedBusWrapper.MessageWrappers}" 
          SelectedItem="{Binding SelectedBusWrapper.SelectedMessageWrapper}" 
          attachedProperties:SelectingItemAttachedProperty.SelectingItem="{Binding SelectedBusWrapper.MessageWrapperToScrollIntoView, 
                            UpdateSourceTrigger=PropertyChanged, 
                            Mode=TwoWay}"> 
        <DataGrid.Columns> 
         <DataGridTemplateColumn Width="Auto" Header="Filter"> 
          <DataGridTemplateColumn.CellTemplate> 
           <DataTemplate> 
            <CheckBox MaxWidth="15" 
               MaxHeight="15" 
               CommandParameter="{Binding}" 
               IsChecked="{Binding Filter}" 
               Style="{StaticResource CheckBoxStyle}" /> 
           </DataTemplate> 
          </DataGridTemplateColumn.CellTemplate> 
         </DataGridTemplateColumn> 
         <DataGridTextColumn Width="9*" 
              Binding="{Binding Message.Name}" 
              Header="Name" /> 
         <DataGridTextColumn Width="9*" 
              Binding="{Binding HexId}" 
              Header="Id" /> 
         <DataGridTextColumn Width="11*" 
              Binding="{Binding Message.Sender}" 
              Header="Sender" /> 
        </DataGrid.Columns> 
       </DataGrid> 

Каждая строка этого DataGrid имеет CheckBox колонку. Если CheckBox не проверен, то все SignalWrappers отображаются на втором DataGrid. Если один или несколько проверяются, то должен отображаться только SignalWrappers контрольной суммы MessageWrappers. Здесь DataGrid:

<DataGrid Grid.Column="1" 
          Margin="3" 
          AutoGenerateColumns="False" 
          CanUserAddRows="False" 
          HorizontalScrollBarVisibility="Hidden" 
          IsReadOnly="True" 
          ItemsSource="{Binding SelectedBusWrapper.SelectedSignalWrappers}" 
          SelectedItem="{Binding SelectedBusWrapper.SelectedSignalWrapper}" 
          SelectionMode="Extended"> 
        <DataGrid.Resources> 
         <Style TargetType="DataGridRow"> 
          <Setter Property="IsSelected" Value="{Binding IsSelected}" /> 
         </Style> 
        </DataGrid.Resources> 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="MouseDoubleClick"> 
          <i:InvokeCommandAction Command="{Binding MouseDoubleClickCommand}" CommandParameter="{Binding}" /> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
        <DataGrid.Columns> 
         <DataGridTemplateColumn Width="Auto" Header="Filter"> 
          <DataGridTemplateColumn.CellTemplate> 
           <DataTemplate> 
            <CheckBox MaxWidth="15" 
               MaxHeight="15" 
               CommandParameter="{Binding}" 
               IsChecked="{Binding Filter}" 
               Style="{StaticResource CheckBoxStyle}" /> 
           </DataTemplate> 
          </DataGridTemplateColumn.CellTemplate> 
         </DataGridTemplateColumn> 
         <DataGridTextColumn Width="6*" 
              Binding="{Binding Signal.Name}" 
              Header="Name" /> 
         <DataGridTemplateColumn Width="Auto" Header="Value"> 
          <DataGridTemplateColumn.CellTemplate> 
           <DataTemplate> 
            <ComboBox MinWidth="75" 
               IsEditable="True" 
               ItemsSource="{Binding Signal.Values.Values}" 
               SelectedItem="{Binding SelectedValue, 
                    UpdateSourceTrigger=PropertyChanged, 
                    Mode=TwoWay}" /> 
           </DataTemplate> 
          </DataGridTemplateColumn.CellTemplate> 
         </DataGridTemplateColumn> 
        </DataGrid.Columns> 
       </DataGrid> 

Теперь, если пользователь выбирает один или более сообщения (ы) в первом DataGrid сигналы этих сообщений должны быть выделены во втором. Если пользователь выбирает сигнал во втором, родительское сообщение должно быть выделено в первом DataGrid.

Bound Свойство MessageWrapper класса:

public bool IsSelected 
    { 
     get 
     { 
      return isSelected; 
     } 
     set 
     { 
      if (isSelected == value) { 
       return; 
      } 
      isSelected = value; 

      foreach (var item in SignalWrappers) { 
       item.IsSelected = value; 
      } 

      RaisePropertyChanged("IsSelected"); 
     } 
    } 

Bound Свойство SignalWrapper класса:

public bool IsSelected 
    { 
     get 
     { 
      return isSelected; 
     } 
     set 
     { 
      if (isSelected == value) { 
       return; 
      } 
      isSelected = value; 

      ParentMessageWrapper.IsSelected = value; 
      RaisePropertyChanged("IsSelected"); 
     } 
    } 

Теперь у меня есть странное behavoir я не могу понять:

Когда я проверить первый CheckBox в первом DataGrid:

Сообщение подсвечивается, второе DataGrid показывает только сигналы этого сообщения и выделяет их. До сих пор это было правильно. Если я сейчас проверяю второе сообщение, он выделяет как строки, так и все сигналы этих строк. Во время отладки я заметил, что происходит, когда первый флаг MessageWrappersIsSelected получает значение false, а флаг всех его сигналов устанавливается в false, что является правильным. Впоследствии второй флаг MessageWrappers устанавливается в true, и все его флаги сигналов устанавливаются в true, что тоже правильно. И по какой-то причине я не могу понять, что сигнал первого MessageWrapperIsSelected имеет значение true, это установит флаг MessageWrappers в true, и это установит флаг других сигналов в true.

Примечание: если я проверю третий CheckBox, все будет работать так, как ожидалось.

Может кто-нибудь понять, почему это так? Заранее спасибо за помощь!

ответ

1

у вас есть много петель при установке IsSelected в SingleWrapper, потому что набор ParentMessageWrapper.IsSelected = value; который вернется, чтобы установить IsSelected в SingleWrapper и так далее.

я полагаю, чтобы сделать метод в SingleWrapper Как это:

public SetIsSelected(bool value) 
{ 
    if (isSelected == value) { 
     return; 
    } 
    isSelected = value; 
    RaisePropertyChanged("IsSelected"); 
} 

и изменить item.IsSelected = value; в MessageWrapper к item.SetIsSelected(value)