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>