【问题标题】:How to trigger the Listview behind when Treeview is click?点击Treeview时如何触发后面的Listview?
【发布时间】:2019-09-23 15:57:44
【问题描述】:

我的列表视图中有树视图,如下所示

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

savedialogHost

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)
            {
            .
            .
            .

我想要这样的东西,每当用户单击树视图时,它也会触发 /click 列表视图后面的列表视图。有可能吗?

【问题讨论】:

    标签: c# wpf listview treeview datatemplate


    【解决方案1】:

    您可以手动选择 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);
            }
    

    【讨论】:

    • 我已经尝试过你的代码,但我有一些问题,在我的情况下,当用户单击树视图时,它会弹出一个对话框主机,在用户将编辑保存在对话框主机后,它将关闭对话框.问题是如果我将ParentItemSelectionChange(sender, false); 放在我的TvItemDisplay_SelectedItemChanged 上,我的dialogHost 将无法正常工作,因为它没有selectedItem,但如果我将ParentItemSelectionChange(sender, false); 放在我的ButtonSave_Click 上,我只能单击一次树视图。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2021-05-11
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多