【问题标题】:Populate ListBox on Selecting TreeView node in WPF using MVVM使用 MVVM 在 WPF 中选择 TreeView 节点时填充 ListBox
【发布时间】:2018-12-15 18:01:28
【问题描述】:

我正在 WPF 中开发一个应用程序,我希望在选择 TreeView 的节点时填充 ListBox。我已经使用 MVVM 模式填充了 TreeView。它实际上包含驱动器(C:\、D:...)及其相应的子文件夹。子文件夹是节点。在选择这些节点时,相应的文件应显示在 ListBox 中。我知道获取文件夹中所有文件的 C# 代码,我也实现了相同的。但是,我没有得到任何映射它们的线索,因此在选择节点时,它们中的文件应该反映在 ListBox 中。

在这方面可以请任何人帮助我吗?该应用程序正在以 MVVM 模式开发,我需要以相同的模式本身。

【问题讨论】:

  • 你试过什么?

标签: wpf mvvm treeview


【解决方案1】:

首先将 Files 集合类添加到您的文件夹类(在树视图中使用)

public class FolderItem
{
    // other class code

    private ObservableCollection<File> _Files = null;

    public ObservableCollection<File> Files
    {
        get
        {
            if (_Files == null) _Files = GetFiles();
            return _Files;
        }
        set
        {
            _Files = value;
        }
    }

}

然后将列表框绑定到选定的树视图项。

<ListBox ItemsSource="{Binding ElementName=myTreeView, Path=SelectedItem.Files}"/>

【讨论】:

  • 我还有一个问题。我可以问你是否不介意。在 TreeView 中选择目录时,文件并与 FullPath 一起填充到列表框中,这很好。但是,在开头附加了另一个单词“FileName”。整个名称以这种方式出现 FileName:C:\FolderName\FileName.xyz。我需要从整个字符串中删除单词“FileName”。您能否建议任何解决方案?我对 WPF 完全陌生,我实际上从事 Web 开发工作,最近开始在 WPF 工作。因此,我陷入了 MVVM 模式。
【解决方案2】:

你可能有很多文件和文件夹,所以我想我会尽可能地延迟加载。

这意味着视图模型最初不需要遍历整个硬盘驱动器,但您需要在选定项更改时采取某种行动。

您不能将 selecteditem 绑定到视图模型,因为它是只读的。

因此,我会使用如下行为: Data binding to SelectedItem in a WPF Treeview

使用它绑定一个 SelectedFolder。 在 SelectedFolder 的设置器中,获取该文件夹的文件夹和文件列表并填充两个集合。一个是该选定项的子集合 - 因为它是文件夹。 另一个是用于在列表框中查看的文件的 observableCollection。 使它成为一个propfull并实现inotifyproprtychanged,所以当我将它设置为一个新集合时它会通知ui。 将该集合绑定到列表框的 itemssource。

【讨论】:

    【解决方案3】:

    基本上 MVVM 模式使用三层:

    1. 模型:基本上它包含模型类和用于获取和操作数据信息的业务逻辑。
    2. ViewModel :它充当模型和视图之间的中间层,附加到不同的视图。
    3. 视图:应用程序的不同视图。

    这里是一个如何用驱动器和文件列表填充窗口的示例。

    类 BindableBaseViewModel

    namespace TalkRepeater.ViewModel
    {
        public class BindableBaseViewModel : DependencyObject,INotifyPropertyChanged
        {
            protected virtual void SetProperty<T>(ref T member, T val,[CallerMemberName] string propertyName = null)
            {
               if (object.Equals(member, val)) return;
               member = val;
               PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
    
            protected virtual void OnPropertyChanged(string propertyName)
            {
              PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
    
            public event PropertyChangedEventHandler PropertyChanged = delegate { };
    
        }
    }
    

    类视图模型

    public  class FoldersControlViewModel : BindableBaseViewModel
    {   
            private ObservableCollection<Folders> _listFolders;
        private ObservableCollection<Folders> _listFiles;
    
            public FoldersControlViewModel()
            {
           FoldersBusinessObject vbo =new FoldersBusinessObject()
                vbo.FillFolders();
            ListFolders = FileBusinessObject.ListFolders;
        }
    
            public ObservableCollection<Folders> ListFolders
            {
                get
                {
                  return _listFolders;
                }
                set
                {
                  _listFolders = value;              
                  OnPropertyChanged("ListFolders");               
                }
            }
    
            public ObservableCollection<Folders> ListFiles
            {
                get
                {
                  return _listFiles;
                }
                set
                {
                  _listFiles = value;              
                  OnPropertyChanged("ListFiles");               
                }
            }   
    
        Public void FillListFiles()
        {
            /*ListFiles= Cod to fill ListFiles*/
        }   
    }
    

    类 BusinessObject

    public class FoldersBusinessObject
    {
         private ObservableCollection<Folders> _ListFolders;
    
         public void FillFolders()
         {
        /* ListFolders= Code To fill the collection ListFolders   */
         } 
    
         public ObservableCollection<Folders> ListFolders
         {
                get
                {
                   return _ListFolders;
                }
                set
                {
                  _ListFolders = value;
                }
            }
    }
    

    文件夹视图

    <Window x:Class="Foldersview"
       xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
       xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" 
       d:DesignHeight = "300" Width="1007" Height="606">
    
        <Grid Margin="10"  >
    
            <Canvas x:Name="canvasFolders" Margin="-10,0,912,10">
                <TreeView x:Name="TreevFolders" ItemsSource="{Binding Path=ListFolders, Mode=TwoWay}" Canvas.Top="5" Canvas.Left="17" Width="142" Height="561" 
                     SelectedItemChanged="TreevFolders_SelectedItemChanged" >               
    
                    <TreeView.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding Path=ListFolders}">                  
                            <TextBlock Text="{Binding Path=FileName}">    
                            </TextBlock>
                        </HierarchicalDataTemplate>
                    </TreeView.ItemTemplate>
    
                </TreeView>
            </Canvas>
    
            <Canvas Margin="159,10,0,10">
                <Listview x:Name="Listview1" ItemsSource="{Binding ListFiles, Mode=TwoWay}"  >
    
                </Listview>
            </Canvas>
    
        </Grid>
    
    </Window>
    

    类文件夹查看后面的代码

    public partial class Foldersview : Window
      {
            private void TreevFolders_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
            {            
                   FoldersControlViewModel vmd = (FoldersControlViewModel)this.DataContext;
                   vmd.FillListFiles ();              
            }
    }
    

    类主窗口

    public class MainWindowViewModel : BindableBase
    {
          private FoldersControlViewModel FoldersviewModel;
          public MainWindowViewModel()
          { 
          FoldersviewModel = new FoldersControlViewModel();                  
              Foldersview=new Foldersview();
          Foldersview.Datacontext=FoldersviewModel;
            }      
    }
    

    亲切

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 2013-06-11
      相关资源
      最近更新 更多