Здравствуйте, это моя проблема: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
показывает только сигналы этого сообщения и выделяет их. До сих пор это было правильно. Если я сейчас проверяю второе сообщение, он выделяет как строки, так и все сигналы этих строк. Во время отладки я заметил, что происходит, когда первый флаг MessageWrappers
IsSelected
получает значение false, а флаг всех его сигналов устанавливается в false, что является правильным. Впоследствии второй флаг MessageWrappers
устанавливается в true, и все его флаги сигналов устанавливаются в true, что тоже правильно. И по какой-то причине я не могу понять, что сигнал первого MessageWrapper
IsSelected
имеет значение true, это установит флаг MessageWrappers
в true, и это установит флаг других сигналов в true.
Примечание: если я проверю третий CheckBox
, все будет работать так, как ожидалось.
Может кто-нибудь понять, почему это так? Заранее спасибо за помощь!