DataGrid 失去选择

DataGrid loses selection

有一个包含产品的类别集合。

每个类别在界面中都由 AvalonDock 选项卡表示,该选项卡具有包含产品的 DataGrid。

现在,当从一个选项卡切换到另一个选项卡时,DataGrid 每次都会更新集合。如果您 select 在第一个选项卡的 table 中的一对行,切换到第二个选项卡并 return 到第一个选项卡,selection 消失。

可能是什么问题?

XAML:

<xcad:DockingManager DocumentsSource="{Binding Examples}">
    <xcad:DockingManager.LayoutItemTemplate>
        <DataTemplate>
            <ListBox ItemsSource="{Binding Content.Items}" 
                     SelectionMode="Extended" />
        </DataTemplate>
    </xcad:DockingManager.LayoutItemTemplate>
    <xcad:LayoutRoot />
</xcad:DockingManager>>

代码隐藏:

public partial class MainWindow : Window
{
    public class Example
    {
        public List<int> Items { get; } = new List<int>();

        public Example()
        {
            for (var i = 0; i < 10; i++)
            {
                Items.Add(i);
            }
        }
    }

    public List<Example> Examples { get; } = new List<Example>();

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        Examples.Add(new Example());
        Examples.Add(new Example());
    }
}

正如@nobody 所建议的,在选项卡之间切换似乎更新了布局,并且选择状态丢失了。如果 UI 不能保持选择状态,那么你可以使用下一层,即展示或视图模型来做同样的事情。

在这种情况下,将 IsSelected 属性 添加到视图模型项并绑定到 ListViewItem 应该可以解决问题。

XAML:

<Grid>
    <xcad:DockingManager DocumentsSource="{Binding Examples}">
        <xcad:DockingManager.DocumentHeaderTemplate>
            <DataTemplate>
                <TextBlock Text="Doc" />
            </DataTemplate>
        </xcad:DockingManager.DocumentHeaderTemplate>
        <xcad:DockingManager.LayoutItemTemplate>
            <DataTemplate>
                <ListBox 
                    DisplayMemberPath="Value"
                    ItemsSource="{Binding Content.Items}" 
                    SelectionMode="Extended">
                    <ListBox.Resources>
                        <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="LightBlue" />
                        <Style TargetType="{x:Type ListBoxItem}">
                            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                        </Style>
                    </ListBox.Resources>
                </ListBox>
            </DataTemplate>
        </xcad:DockingManager.LayoutItemTemplate>
        <xcad:LayoutRoot />
    </xcad:DockingManager>
</Grid>

代码隐藏:

public partial class MainWindow : Window
{
    public class ExampleItem
    {
        public int Value { get; set; }
        public bool IsSelected { get; set; }
    }
    public class Example
    {
        public List<ExampleItem> Items { get; } = new List<ExampleItem>();

        public Example()
        {
            for (var i = 0; i < 10; i++)
            {
                Items.Add(new ExampleItem { Value = i });
            }
        }
    }

    public List<Example> Examples { get; } = new List<Example>();

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        Examples.Add(new Example());
        Examples.Add(new Example());
    }
}