2017-07-19 64 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()); 
    } 
}