【问题标题】:DataGrid loses selectionDataGrid 失去选择
【发布时间】:2017-07-19 20:40:20
【问题描述】:

有一系列产品类别。

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

现在,当从选项卡切换到选项卡时,DataGrid 每次都会更新集合。如果您在第一个选项卡上选择表中的一对行,切换到第二个选项卡并返回到第一个选项卡,选择就会消失。

可能是什么问题?

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());
    }
}

【问题讨论】:

标签: c# wpf xaml avalondock xceed


【解决方案1】:

正如@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());
    }
}

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多