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:

  1. 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ć.
  2. 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ń)
  3. 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ć?