Заполните ListBox при выборе узла TreeView в WPF с помощью MVVM - PullRequest
0 голосов
/ 15 декабря 2018

Я разрабатываю приложение в WPF, в котором я хочу заполнить ListBox при выборе узла TreeView.Я заполнил TreeView, используя шаблон MVVM.На самом деле он содержит диски (C: \, D: ...) и соответствующие им подпапки.Подпапки являются узлами.При выборе этих узлов соответствующие файлы должны быть показаны в ListBox.Я знаю код C #, чтобы получить все файлы в папках, я также реализовал то же самое.Однако я не понимаю, как их отобразить, поэтому при выборе узлов файлы в них должны отражаться в ListBox.

Может ли кто-нибудь помочь мне в этом отношении?Приложение разрабатывается в соответствии с шаблоном MVVM, и мне нужен сам шаблон.

Ответы [ 3 ]

0 голосов
/ 15 декабря 2018

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

Это означает, что модели представления не нужно проходить итерацию по всей сложности.изначально диск, но вам нужно как-то действовать при изменении selecteditem.

Вы не можете привязать selecteditem к модели просмотра, потому что она только для чтения.

Поэтому я бы использовал поведение вроде: Привязка данных к SelectedItem в WPF Treeview

Привязать SelectedFolder, используя это.В установщике SelectedFolder перейдите к списку папок и файлов для этой папки и заполните две коллекции.Одним из них является дочерняя коллекция этого выбранного элемента - для его папок.Другой является observableCollection для файлов, чтобы увидеть в списке.Сделайте это правильным и внедрите inotifyproprtyzed, поэтому, когда я устанавливаю его в новую коллекцию, он уведомляет пользовательский интерфейс.Свяжите эту коллекцию с источником элементов списка.

0 голосов
/ 16 декабря 2018

В основном шаблон MVVM использует три уровня:

  1. Модель: в основном он содержит классы модели и бизнес-логику для получения и обработки информации данных.
  2. ViewModel: Itдействует как промежуточный слой между моделью и представлениями, он прикреплен к различным представлениям.
  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 { };

    }
}

Класс ViewModel

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

Foldersview

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

Класс Foldersview Код Позади

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

Класс Mainwindow

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

Cordialy

0 голосов
/ 15 декабря 2018

Сначала добавьте класс коллекции 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}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...