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> 

나는 기본적으로 행을 원하는 사용자가 선택하면 파란색으로 강조 표시됩니다.

나는 MessageWrapperSignalWrapper 클래스를가집니다. 각 MessageWrapper에는 SignalWrappers (때때로 비어있을 수 있음) 목록이 있습니다. 그래서 첫 번째 데이터 그리드는 모든 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 하나 이상의 메시지 (들)를 선택하면

<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에 강조 표시되어야합니다. MessageWrapper 클래스의

바운드 프로퍼티 :

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

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

      RaisePropertyChanged("IsSelected"); 
     } 
    } 
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가 예상대로 다시 작동합니다.

왜 이것이 사람인지 이해할 수 있습니까? 미리 도움을 주셔서 감사합니다! 이 IsSelectedSingleWrapper에 등을 설정 돌아갑니다 ParentMessageWrapper.IsSelected = value; 설정 때문에 SingleWrapperIsSelected을 설정할 때

답변

1

당신은 많은 루프를 가지고있다.

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

item.SetIsSelected(value)

MessageWrapperitem.IsSelected = value;을 변경

는이 같은 SingleWrapper의 방법을 만들기 위해 가정

관련 문제