DataGrid SelectionUnit = Cell отключает всю поддержку для выбранной строки?
.Net 4 WPF DataGrid С# MMVM
Когда DataGrid SelectionUnit является полной строкой, привязка данных wpf и сборка позаботятся о том, чтобы сообщить мне в viewmodel, что является активно выбранным элементом, через свойство viewititem. Это отлично работает для readonly grid с режимом выбора, установленным в fullrow.
Теперь у меня есть редактируемая сетка. Поэтому я устанавливаю SelectionUnit = Cell, чтобы было легче определить, какая ячейка находится. Теперь неожиданно сетка больше не имеет возможности отслеживать элемент выбора. Я не могу даже установить SelectedItem, когда он установлен в режим ячейки. Итак, теперь модель просмотра всегда думает об этом в первой строке. Я могу обработать SelectedCellsChanged в сетке, чтобы выяснить, в какой строке я включен, я просто не могу позволить viewmodel знать, так как сетка SelectedItem больше не может быть установлена!
Я не понимаю, почему в режиме выбора ячейки сетка еще не может иметь SelectedItem.
Заканчивая hardcoding в моей сетке, чтобы передать ItemSource в мой просмотр коллекции, чтобы вызвать MoveCurrentTo из события SelectedCellsChanged, есть ли другой MVVM истинный способ сохранить представление CurrentItem в синхронизации с сеткой?
Либо это, либо я меняю стиль сетки, чтобы удалить или уменьшить эффект выделения строки, когда у меня есть редактируемая сетка.
Ответы
Ответ 1
Я искал те же проблемы и нашел простое решение
Чтобы получить доступ к строке с SelectionUnit
, установленной в Cell
, вам нужно сделать:
DataGridXX.SelectedCells[0].item
Он работает только в том случае, если вы можете выбрать только одну ячейку во время (не в расширенном режиме).
Ответ 2
i Также есть аналогичная проблема, поэтому вот стиль, который я использовал (скопирован из сети).
Таким образом, вы копируете тему WhistlerBlue из http://datagridthemesfromsl.codeplex.com/ и вносите следующие изменения. Надеюсь, это поможет.
<!--Cell-->
<Style x:Key='CellStyle' TargetType="{x:Type controls:DataGridCell}" >
<Setter Property="Foreground" Value="{StaticResource ThemeForegroundBrush}" />
<Setter Property="Height" Value="Auto" />
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Stretch"/>
<Setter Property="Cursor" Value="Arrow" />
<Setter Property="BorderThickness" Value="1" />
<!--Padding hack-->
<Setter Property="Padding" Value="2 5 2 5" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type controls:DataGridCell}">
<Grid x:Name="Root" Background="Transparent">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Rectangle x:Name="FocusVisual" Margin="0,-2,0,0"
Stroke="White" Fill="White"
Opacity="0" IsHitTestVisible="false"/>
<ContentPresenter Margin="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}" Cursor="{TemplateBinding Cursor}"/>
<Rectangle x:Name="RightGridLine" VerticalAlignment="Stretch" Width="1" Grid.Column="1" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- DataGridRow -->
<Style x:Key='RowStyle' TargetType="{x:Type controls:DataGridRow}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type controls:DataGridRow}">
<Border x:Name="DGR_Border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
SnapsToDevicePixels="True">
<primitives:SelectiveScrollingGrid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height='Auto' />
</Grid.RowDefinitions>
<Rectangle x:Name="Selected" Margin="0" Grid.RowSpan="2" Grid.ColumnSpan="2"
Fill="{StaticResource BtnOverFill}" Stroke="{StaticResource selectedStroke}"
Opacity="0"/>
<Rectangle x:Name="SelectedHighlight" Margin="1" Grid.RowSpan="2" Grid.ColumnSpan="2"
Stroke="#A0FFFFFF"
Opacity="0"/>
<primitives:DataGridRowHeader Grid.RowSpan="2"
primitives:SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical"
Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type controls:DataGrid}},
Path=HeadersVisibility,
Converter={x:Static controls:DataGrid.HeadersVisibilityConverter},
ConverterParameter={x:Static controls:DataGridHeadersVisibility.Row}}"/>
<Rectangle x:Name="Over" Margin="0" Grid.RowSpan="2" Grid.ColumnSpan="2"
Fill="{StaticResource hoverGradient}"
Stroke="{StaticResource hoverStroke}"
Opacity="0"/>
<primitives:DataGridCellsPresenter Grid.Column="1"
ItemsPanel="{TemplateBinding ItemsPanel}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
<primitives:DataGridDetailsPresenter Grid.Column="1" Grid.Row="1"
x:Name='DetailsPresenter'
primitives:SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding RelativeSource={RelativeSource AncestorType={x:Type controls:DataGrid}}, Path=AreRowDetailsFrozen, Converter={x:Static controls:DataGrid.RowDetailsScrollingConverter}, ConverterParameter={x:Static controls:SelectiveScrollingOrientation.Vertical}}"
Visibility="{TemplateBinding DetailsVisibility}"
/>
<Rectangle Height="1" HorizontalAlignment="Stretch"
x:Name="BottomGridLine"
Fill="{StaticResource HorizontalVerticalGridLinesBrush}"
Grid.Column="1" Grid.Row="2" />
</primitives:SelectiveScrollingGrid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property='IsSelected' Value='True'>
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0" Storyboard.TargetName="Selected" Storyboard.TargetProperty="Opacity" To="0.84"/>
<DoubleAnimation Duration="0" Storyboard.TargetName="SelectedHighlight" Storyboard.TargetProperty="Opacity" To="1"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0" Storyboard.TargetName="Selected" Storyboard.TargetProperty="Opacity" To="0"/>
<DoubleAnimation Duration="0" Storyboard.TargetName="SelectedHighlight" Storyboard.TargetProperty="Opacity" To="0"/>
</Storyboard>
</BeginStoryboard>
</Trigger.ExitActions>
<!--<Setter Property="DetailsVisibility" Value="Visible" />-->
</Trigger>
<MultiTrigger >
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Property="IsSelected" Value="False" />
</MultiTrigger.Conditions>
<MultiTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0" Storyboard.TargetName="Over" Storyboard.TargetProperty="Opacity" To="0.73"/>
</Storyboard>
</BeginStoryboard>
</MultiTrigger.EnterActions>
<MultiTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0" Storyboard.TargetName="Over" Storyboard.TargetProperty="Opacity" To="0"/>
</Storyboard>
</BeginStoryboard>
</MultiTrigger.ExitActions>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="True" />
<Condition Property="IsFocused" Value="False" />
</MultiTrigger.Conditions>
<MultiTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0" Storyboard.TargetName="Selected" Storyboard.TargetProperty="Opacity" To="0.84"/>
<DoubleAnimation Duration="0" Storyboard.TargetName="SelectedHighlight" Storyboard.TargetProperty="Opacity" To="1"/>
</Storyboard>
</BeginStoryboard>
</MultiTrigger.EnterActions>
<MultiTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0" Storyboard.TargetName="Selected" Storyboard.TargetProperty="Opacity" To="0"/>
<DoubleAnimation Duration="0" Storyboard.TargetName="SelectedHighlight" Storyboard.TargetProperty="Opacity" To="0"/>
</Storyboard>
</BeginStoryboard>
</MultiTrigger.ExitActions>
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>