2017-07-19 19 views
5

製品にはカテゴリのコレクションがあります。DataGridが選択を失う

各カテゴリは、AvalonDockタブでインターフェイスに表示されます。このタブには、製品を含むDataGridがあります。

タブからタブに切り替えると、DataGridは毎回コレクションを更新します。最初のタブの表の行のペアを選択し、2番目のタブに切り替えて最初のタブに戻ると、選択が消えます。

何が問題なのですか?

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が示唆したようには、タブの切り替えがレイアウトを更新しているようだ、と選択状態が失われます。 UIが選択状態を維持できない場合は、次のレイヤ、つまりプレゼンテーションまたはビューモデルを使用して同じことを行うことができます。

この場合、ビューモデル項目に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()); 
    } 
} 
関連する問題