Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Dynamické rozbalení TreeView ve WPF MVVM

Aktivity
Avatar
Maros2470
Člen
Avatar
Maros2470:18.12.2017 6:33

Zdravím.

Mám v aplikaci TreeView, kde SelectedItem provádím přes Behavior. Potřeboval bych poradit jak provést to, aby po přidání položky do databáze se mi tato v TreeView rozbalila.

Připojuji Behavior:

public class BindableSelectedItemBehavior : Behavior<TreeView>
    {
        #region SelectedItem Property

        public object SelectedItem
        {
            get { return GetValue(SelectedItemProperty); }
            set { SetValue(SelectedItemProperty, value); }
        }

        public static readonly DependencyProperty SelectedItemProperty =
            DependencyProperty.Register("SelectedItem", typeof(object), typeof(BindableSelectedItemBehavior), new UIPropertyMetadata(null, OnSelectedItemChanged));

        private static void OnSelectedItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            var item = e.NewValue as TreeViewItem;
            if (item != null)
            {
                item.SetValue(TreeViewItem.IsSelectedProperty, true);

            }
        }

        #endregion

        protected override void OnAttached()
        {
            base.OnAttached();

            AssociatedObject.SelectedItemChanged += OnTreeViewSelectedItemChanged;
        }

        protected override void OnDetaching()
        {
            base.OnDetaching();

            if (AssociatedObject != null)
            {
                AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged;
            }
        }

        private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            SelectedItem = e.NewValue;
        }
    }

a

xaml:

<TreeView Name="trvCust" ItemsSource="{Binding Customers}" Grid.Column="0" Grid.Row="1">
                <i:Interaction.Behaviors>
                    <behaviours:BindableSelectedItemBehavior SelectedItem="{Binding SelectCustomer, Mode=TwoWay}"/>
                </i:Interaction.Behaviors>
                <TreeView.Resources>
                    <HierarchicalDataTemplate DataType="{x:Type mod:Customer}" ItemsSource="{Binding Places}">
                        <StackPanel Orientation="Horizontal">
                            <StackPanel.ContextMenu>
                                <ContextMenu >
                                    <MenuItem Header="Zákazníka" Command="{Binding Path=DataContext.NewCustomerCommand, Source={x:Reference installationGrid}}">
                                        <MenuItem.Icon>
                                            <Image Source="/Firma_2018;component/Images/Add11.png" Width="15" Height="15"/>
                                        </MenuItem.Icon>
                                    </MenuItem>
                                    <MenuItem Header="Objekt" Command="{Binding Path=DataContext.NewObjectCommand, Source={x:Reference installationGrid}}">
                                        <MenuItem.Icon>
                                            <Image Source="/Firma_2018;component/Images/Add11.png" Width="15" Height="15"/>
                                        </MenuItem.Icon>
                                    </MenuItem>
                                    <MenuItem Header="Zákazníka" Command="{Binding Path=DataContext.DeleteCustomerCommand, Source={x:Reference installationGrid}}">
                                        <MenuItem.Icon>
                                            <Image Source="/Firma_2018;component/Images/Delete11.png" Width="15" Height="15"/>
                                        </MenuItem.Icon>
                                    </MenuItem>
                                    <MenuItem Header="Nastavení" Command="{Binding Path=DataContext.SettingFrameCommand, Source={x:Reference installationGrid}}">
                                        <MenuItem.Icon>
                                            <Image Source="/Firma_2018;component/Images/Seting11.png" Width="15" Height="15"/>
                                        </MenuItem.Icon>
                                    </MenuItem>
                                </ContextMenu>
                            </StackPanel.ContextMenu>
                            <Label Content="{Binding FirmName}"/>
                            <Label Content="{Binding PostCode.City}"/>
                        </StackPanel>
                    </HierarchicalDataTemplate>

                    <HierarchicalDataTemplate DataType="{x:Type mod:Place}" ItemsSource="{Binding Childrens}">
                        <StackPanel Orientation="Horizontal">
                            <StackPanel.ContextMenu>
                                <ContextMenu >
                                    <MenuItem Header="Umístění" Command="{Binding Path=DataContext.NewPlaceCommand, Source={x:Reference installationGrid}}">
                                        <MenuItem.Icon>
                                            <Image Source="/Firma_2018;component/Images/Add11.png" Width="15" Height="15"/>
                                        </MenuItem.Icon>
                                    </MenuItem>
                                    <MenuItem Header="Revizi" Command="{Binding Path=DataContext.NewInstallationCommand, Source={x:Reference installationGrid}}">
                                        <MenuItem.Icon>
                                            <Image Source="/Firma_2018;component/Images/Add11.png" Width="15" Height="15"/>
                                        </MenuItem.Icon>
                                    </MenuItem>
                                    <MenuItem Header="Umístění" Command="{Binding Path=DataContext.DeletePlaceCommand, Source={x:Reference installationGrid}}">
                                        <MenuItem.Icon>
                                            <Image Source="/Firma_2018;component/Images/Delete11.png" Width="15" Height="15"/>
                                        </MenuItem.Icon>
                                    </MenuItem>
                                    <MenuItem Header="Nastavení" Command="{Binding Path=DataContext.SettingFrameCommand, Source={x:Reference installationGrid}}">
                                        <MenuItem.Icon>
                                            <Image Source="/Firma_2018;component/Images/Seting11.png" Width="15" Height="15"/>
                                        </MenuItem.Icon>
                                    </MenuItem>
                                </ContextMenu>
                            </StackPanel.ContextMenu>
                            <Label Content="&#xf015;" Style="{StaticResource fontawesome}" Foreground="Aqua"/>
                            <Label Content="{Binding Uid}" Foreground="Aqua"/>
                        </StackPanel>
                    </HierarchicalDataTemplate>

                    <HierarchicalDataTemplate DataType="{x:Type mod:Installation}">
                        <StackPanel Orientation="Horizontal">
                            <StackPanel.ContextMenu>
                                <ContextMenu >
                                    <MenuItem Header="Revizi" Command="{Binding Path=DataContext.DeleteInstallationCommand, Source={x:Reference installationGrid}}">
                                        <MenuItem.Icon>
                                            <Image Source="/Firma_2018;component/Images/Add11.png" Width="15" Height="15"/>
                                        </MenuItem.Icon>
                                    </MenuItem>
                                    <MenuItem Header="Nastavení" Command="{Binding Path=DataContext.SettingFrameCommand, Source={x:Reference installationGrid}}">
                                        <MenuItem.Icon>
                                            <Image Source="/Firma_2018;component/Images/Add11.png" Width="15" Height="15"/>
                                        </MenuItem.Icon>
                                    </MenuItem>
                                </ContextMenu>
                            </StackPanel.ContextMenu>
                            <Image Width="15" Height="15" Source="/Firma_2018;component/Images/Delete11.png" Visibility="{Binding NewRevision, Converter={StaticResource BoolVisiblityConverter}}"/>
                            <Label Content="&#xf15c;" Style="{StaticResource fontawesome}" Foreground="White"/>
                            <Label Content="{Binding RevNum}" Foreground="{Binding LastDate, Converter={StaticResource ColorDateConverter}}"/>
                            <!--<Label Content="/" Foreground="{Binding LastDate, Converter={StaticResource ColorDateConverter}}"/>
                            <Label Content="{Binding Prefix}" Foreground="{Binding LastDate, Converter={StaticResource ColorDateConverter}}"/>-->
                        </StackPanel>
                    </HierarchicalDataTemplate>

                </TreeView.Resources>
            </TreeView>

Díky za rady.

 
Odpovědět
18.12.2017 6:33
Avatar
Neaktivní uživatel:18.12.2017 9:10

Ahoj,
zaujimavy pristup. Neviem, zda je pristup cez Behavior spravny.
Kazdopadne, nie je mozne vystavit na bindovanom objekte property IsExpanded, ktory by ovladal, zda je rozbaleny / zbaleny node Treeview? Ked to nie je mozne, tak existuje riesenie cez ItemContainer­Generator, ale je nutne rekurzivne prechadzat vsetky nody a dohladat konkretny treeviewItem.

Ako to mas premyslene? Stromova struktura so zakaznikmi, instalaciami a miestami. Oznacis node instalacie, das pridat novy zaznam?

M.

Nahoru Odpovědět
18.12.2017 9:10
Neaktivní uživatelský účet
Avatar
Maros2470
Člen
Avatar
Odpovídá na Neaktivní uživatel
Maros2470:19.12.2017 7:08

Ano, označím node, tím dám SelectCustomer a potom přes ContextMenu vybírám příkaz přidat, nebo vymazat. Na jednotlivých nodech je omezeno zda lze přidat zákazníka, umístění, nebo instalaci (revizní zprávu instalace).

 
Nahoru Odpovědět
19.12.2017 7:08
Avatar
Neaktivní uživatel:19.12.2017 9:22

Ked oznacis node, pridas do neho nieco v DB a potrebujes ho rozbalit, spravne? Ten oznaceny.

Nahoru Odpovědět
19.12.2017 9:22
Neaktivní uživatelský účet
Avatar
Maros2470
Člen
Avatar
Odpovídá na Neaktivní uživatel
Maros2470:19.12.2017 9:24

Ano, tak aby se rozbalil na tom přidaném objektu

 
Nahoru Odpovědět
19.12.2017 9:24
Avatar
Neaktivní uživatel:19.12.2017 9:27

Ok, hmm ... nasledujuce alternativy:

  1. pridat property IsExpanded a tu bindovat na TreeViewItem
  2. pridany objekt je bindovany do hierarchickej kolekcie (predpokladam), tak pouzit ItemContainer­Generator, aby si ziskal TreeViewItem, na ktory zavolat IsExpanded = true a on sa rozbali.

M.

Nahoru Odpovědět
19.12.2017 9:27
Neaktivní uživatelský účet
Avatar
Maros2470
Člen
Avatar
Odpovídá na Neaktivní uživatel
Maros2470:19.12.2017 10:38

No tak tady už jsem trochu mimo

 
Nahoru Odpovědět
19.12.2017 10:38
Avatar
Neaktivní uživatel:19.12.2017 10:42

Ahoj,
dle kodu vidim, ze tvoj Treeview binduje kolekciu Customers. Predpokladam, ze tato kolekcia je hierarchicka, viz. xaml HierarchicalDa­taTemplate.
Novy zaznam, ktory ulozis do DB sa prida do kolekcie. Cize tym padom sa to da riesit tvoma sposobmi, ako som ti napisal. Bod 'a' vo viewmodely, bod 'b' snad i cez behavior.
Nemam cas si zalozit wpf aplikaciu a skusit si to.
Ci ako si mimo? :) ...

M.

Nahoru Odpovědět
19.12.2017 10:42
Neaktivní uživatelský účet
Avatar
Maros2470
Člen
Avatar
Odpovídá na Neaktivní uživatel
Maros2470:19.12.2017 10:43

Já myslel, jestli není nějaká možnost v rámci Behavior?

 
Nahoru Odpovědět
19.12.2017 10:43
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.