MVVM 架构下的 DataGrid 默认选中第一行但未高亮显示。

7

我有一个数据表格,它绑定在我的ViewModel的集合上。当窗口加载时,数据表格会被填充,并设置SelectedItem。(我知道这点,因为我有一个详细视图绑定到选定项。)但是该行没有被突出显示。如果我点击该行,它就会被突出显示,并正常工作。

如何使默认选择的行显示为高亮?

<DataGrid IsSynchronizedWithCurrentItem="True" SelectionUnit="FullRow"  RowHeaderWidth="0"  VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible"  IsReadOnly="True" ItemsSource="{Binding Items}"  SelectedItem="{Binding Path=SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False">
    <DataGrid.Columns>                    
        <DataGridTextColumn Header="Run Date" Binding="{Binding Path=RunDate, StringFormat={}{0:MM-dd-yy HH:mm:ss} }"  />
        <DataGridTextColumn Header="Description" Binding="{Binding Description}" />
        <DataGridTextColumn Header="Duration" Binding="{Binding Duration}" />
        <DataGridTextColumn Header="Deviation" Binding="{Binding Deviation}" />
    </DataGrid.Columns>
</DataGrid>

3
我猜你已经正确地设置了所选项目,但是没有将焦点放在“数据表格”上。据我所知,如果“数据表格”本身或其子对象之一没有聚焦,“数据表格”不会突出显示所选行。 - Herdo
有没有一种MVVM“兼容”的方法可以在绑定后将焦点设置到数据网格上?虽然我认为我可以在视图代码后台完成这个操作,而不会违反模式。 - jrandomuser
1
您可以查看关于通过MVVM设置聚焦元素的这个答案。但是,在视图的代码后台中进行设置会更容易。此外,如果您设置了DataGridSelectedItem属性,则至少应该以浅灰色突出显示。一旦您需要将其突出显示为蓝色,就应重新考虑更新视图模型的SelectedItem属性的方式。您可能希望从同一个方法中设置SelectedItemUIElement的焦点。 - Herdo
1
@jrandomuser 我认为在代码后台设置焦点绝对与MVVM模式兼容,因为它只涉及视图相关的内容。 - Artholl
@Artholl:Code-behind 兼容 MVVM,但它会减少功能的重用性,我会将其实现为行为。 - Rekshino
2个回答

0

你只需要一个样式来告诉选定项该怎么做

<Style x:Key="SomeStyle" TargetType="{x:Type DataGridRow}" >
        <Style.Triggers>
            <Trigger Property="DataGridRow.IsSelected" Value="True">
                <Setter Property="Background" Value="Red" />
            </Trigger>
        </Style.Triggers>
    </Style>

然后将其应用到您的xaml中的datagrid

<DataGrid RowStyle="{StaticResource SomeStyle}"...

-1

如我在评论中所提到的,有可能通过行为来将网格聚焦于选择更改。这样,您就可以使选择被突出显示:

using System.Windows.Controls;
using System.Windows.Interactivity;

public class FocusGridOnSelectionChanged : Behavior<DataGrid>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.SelectionChanged += AssociatedObject_SelectionChanged;
    }

    private void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        AssociatedObject?.Focus();
    }

    protected override void OnDetaching()
    {
        AssociatedObject.SelectionChanged -= AssociatedObject_SelectionChanged;

        base.OnDetaching();
    }

}


xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
<DataGrid ... >

    <i:Interaction.Behaviors>
        <yourbehaviorsns:FocusGridOnSelectionChanged/>
    </i:Interaction.Behaviors>

    ...

</DataGrid>

但我担心,这不是你想要的完整解决方案,因为如果网格失去焦点,选定的项目将失去它们的高亮。

因此,如果您希望在网格失去焦点后也突出显示选择,则应重写DataGridRow控件模板,即视觉样式“UnfocusedSelected”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接