Witam
Potrzebuję stworzyć treeView, który będzie odpowiadał 1:1 zawartości tablicy (encji) stworzonej w Entity Framework, która wygląda tak:
class GrupaProduktow
{
[Key]
public int Id { get; set; }
[Required]
[StringLength(50)]
public String Name { get; set; }
public int? ParentId { get; set; }
public virtual GrupaProduktow Parent { get; set; }
public virtual ICollection<GrupaProduktow> Children { get; set; }
public GrupaProduktow()
{
Children = new List<GrupaProduktow>();
}
}
Sęk w tym, że pliki baz zawierające te dane muszą być podmieniane w trakcie programu. Nie mogę więc statycznie zmapować tego z bazą. Muszę to zrobić dynamicznie.
Udało się zrobić tyle, że program "przerzuca" mi zawartość ww. tabeli do treeView-a. Mój kod wygląda tak:
XAML:
<Grid.Resources>
<local:HierarchyConverter x:Key="HierarchyConverter" />
<HierarchicalDataTemplate x:Key="SelfRefTemplate" ItemsSource="{Binding Converter={StaticResource HierarchyConverter}}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</Grid.Resources>
<TreeView ItemTemplate="{StaticResource SelfRefTemplate}" x:Name="treeView" HorizontalAlignment="Left" Height="288" Margin="0,22,0,0" VerticalAlignment="Top" Width="168" Background="{x:Null}">
</TreeView>
ładowanie bazy:
treeView.ItemsSource = db.GrupaProduktows.Include(p => p.Children).Where(p => p.ParentId == null).ToList();
Mam teraz trzy problemy:
- Potrzebuje aby w momencie aktualizacji (dodawanie, usuwanie, zmiana nazwy) aktualizowało treeView i to w taki sposób aby elementy rozwinięte pozostały rozwinięte, zaznaczone, zaznaczone i okno było w tym samym miejscu (jeśli wywołam jeszcze raz kod ładowanie bazy to zwinie mi wszystkie elementy i przewinie do góry). Czytałam, że mogę to zrobić jakimś observerem, jednak nie potrafię się w tym połapać.
- Potrzebuje podłączyć menu contekstowe pod każdy z elementów. Sytuacja jednak jest tego typu, że nie każdy będzie miał taką samą listę pozycji w tym menu kontekstowym (niektóre elementy nie będą miały funkcji usuń)
- Po wywołaniu funkcji z powyższego menu kontekstowego będę potrzebować wiedzieć z jakiego elementu (chodzi o ID z klasy Entity Framework) został on odpalony. W jaki sposób to najlepiej zrealizować?