2017-07-19 77 views
5

有一个产品类别的集合。DataGrid失去选择

每个类别都在界面中由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()); 
    } 
} 

enter image description here

+0

还没有尝试过,但IsSynchronizedWithCurrentItem可能的帮助。 –

+0

@SushilMate,它没有帮助。 – maxwell

+0

似乎标签之间的切换每次更新布局,从而清除选择。为什么不用'TabControl'呢? –

回答

2

由于@nobody建议,标签之间的切换似乎更新了布局,并选择状态丢失。如果用户界面无法保持选择状态,则可以使用下一层即演示文稿或视图模型来执行相同操作。

在这种情况下,将IsSelected属性添加到视图模型项目和绑定到ListViewItem应该做的伎俩。

enter image description here

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