Как вызвать Listview позади, когда Treeview щелкает? - PullRequest
0 голосов
/ 06 мая 2019

У меня есть вид дерева внутри моего списка, как показано ниже

 <ListView  x:Name="LvItemDisplay" ItemsSource="{Binding itemDisplayList}" SelectionChanged="LvItemDisplay_SelectionChanged">

      <ListView.ItemTemplate>

            <DataTemplate x:Name="dtItemDisplay">

                    <TreeView x:Name="TvItemDisplay" Background="Transparent" ItemsSource="{Binding itemDisplayList}" MouseDown="TvItemDisplay_MouseDown_1" SelectedItemChanged="TvItemDisplay_SelectedItemChanged"  >
                        .
                        .
                        .

У меня есть событие клика как для просмотра дерева, так и для просмотра списка. и то и другое, при щелчке на нем появляется диалоговое окно, которое пользователь может редактировать и которое связывает их.

проблема в том, что всякий раз, когда пользователь хочет щелкнуть древовидное представление, пользователю сначала нужно нажать на просмотр списка, чтобы получить SelectedItem. если нет, ничего не произойдет, поскольку SelectedItem будет нулевым.

это код для списка

private void LvItemDisplay_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

                ListViewItem listViewItem = (ListViewItem)(LvItemDisplay.ItemContainerGenerator.ContainerFromItem(LvItemDisplay.SelectedItem));
                TreeView treeView = null;
                DialogHost dialogHost = null;

                if (LvItemDisplay.SelectedIndex != -1)
                {
                    if (listViewItem != null)
                    {
                        //get the listViewItem's template parent
                        ContentPresenter templateParent = GetFrameworkElementByName<ContentPresenter>(listViewItem);

                        //get the DataTemplate that treeview in.
                        DataTemplate dataTemplate = LvItemDisplay.ItemTemplate;

                        if (dataTemplate != null && templateParent != null)
                        {

                            treeView = dataTemplate.FindName("TvItemDisplay", templateParent) as TreeView;
                            if (treeView != null)
                            {
                                dialogHost = dataTemplate.FindName("dialogBoxEditQty", templateParent) as DialogHost;
                                dialogHost.IsOpen = true;
                            }

                        }

                    }
                }
        }

и для дерева

  private void TvItemDisplay_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        ListViewItem listViewItem = (ListViewItem)(LvItemDisplay.ItemContainerGenerator.ContainerFromItem(LvItemDisplay.SelectedItem));
        TreeView treeView = null;
        DialogHost dialogHost = null;

            if (listViewItem != null)
            {
               //get the listViewItem's template parent
                ContentPresenter templateParent = GetFrameworkElementByName<ContentPresenter>(listViewItem);

                //get the DataTemplate that treeview in.
                DataTemplate dataTemplate = LvItemDisplay.ItemTemplate;

                if (dataTemplate != null && templateParent != null)
                {
                    treeView = dataTemplate.FindName("TvItemDisplay", templateParent) as TreeView;
                }

                if (treeView != null)
                {
                    dialogHost = dataTemplate.FindName("dialogBoxEditQty", templateParent) as DialogHost;
                    dialogHost.IsOpen = true;
                }               
        }          
    }

save для dialogHost

private void ButtonSave_Click(object sender, RoutedEventArgs e)
    {

        try
        {

            // get the current selected item
            ListViewItem listViewItem = (ListViewItem)(LvItemDisplay.ItemContainerGenerator.ContainerFromItem(LvItemDisplay.SelectedItem));


            DialogHost dialogHost = null;
            if (listViewItem != null)
            {
            .
            .
            .

Я хочу что-то вроде того, чтобы каждый раз, когда пользователь нажимал на древовидную структуру, он вызывал список позади или щелкал на виде списка. это возможно?

1 Ответ

0 голосов
/ 06 мая 2019

Вы можете вручную выбрать элемент ListView

Выбор TreeView изменен

private void TvItemDisplay_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            LvItemDisplay.SelectionChanged -= LvItemDisplay_SelectionChanged;
            ParentItemSelectionChange(sender, true);         

            // Your code

            ParentItemSelectionChange(sender, false);
            LvItemDisplay.SelectionChanged += LvItemDisplay_SelectionChanged;

        }

Вспомогательные методы

 private FrameworkElement ParentItemSelectionChange(object sender, bool selChange)
        {
            var frameworkElement = sender as FrameworkElement;
            if (frameworkElement != null)
            {
                var item = FindParent<ListViewItem>(frameworkElement);
                if (item != null)
                    item.IsSelected = selChange;
            }
            return frameworkElement;
        }

        public T FindParent<T>(DependencyObject child) where T : DependencyObject
        {
            DependencyObject parentObject = VisualTreeHelper.GetParent(child);
            if (parentObject == null) return null;
            T parent = parentObject as T;
            if (parent != null)
                return parent;
            return FindParent<T>(parentObject);
        }
...