2017-07-19 69 views
5

Istnieje zbiór kategorii z produktami.DataGrid traci wybór

Każda kategoria jest reprezentowana w interfejsie przez kartę AvalonDock, która ma DataGrid z produktami.

Teraz po przełączeniu z karty na kartę DataGrid aktualizuje kolekcję za każdym razem. Jeśli wybierzesz parę wierszy w tabeli na pierwszej karcie, przejdziesz do drugiej karty i powrócisz do pierwszej, wybór zniknie.

Co może być problemem?

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>> 

Code-tył:

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

nie próbowałem ale IsSynchronizedWithCurrentItem może pomóc. –

+0

@SushilMate, to nie pomogło. – maxwell

+0

Wygląda na to, że przełączanie się między kartami aktualizuje układ za każdym razem, usuwając zaznaczenie. Dlaczego zamiast tego nie używałbyś 'TabControl'? –

Odpowiedz

2

Jak @nobody zasugerował, przełączanie między kartami wydaje się zaktualizować układ, a państwo wybór jest stracone. Jeśli interfejs użytkownika nie może zachować stanu wyboru, można użyć następnej warstwy, np. Prezentacji lub modelu widoku, aby zrobić to samo.

W tym przypadku dodanie właściwości IsSelected do elementu modelu widoku i powiązania z ListViewItem powinno wystarczyć.

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> 

Code-tył:

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