WPF MVVM DataGrid Binding - PullRequest
       10

WPF MVVM DataGrid Binding

0 голосов
/ 25 апреля 2020

Ну, не проблема, просто работаю над своей курсовой работой и пробую шаблон MVVM. Все работает хорошо или я так думаю. Но эта вещь не должна работать, и я не понимаю, почему все в порядке ...

Вот ViewModel:

    public class ViewModel : OnPropertyChangedClass
    {
        private readonly static IService service = new Service();
        private static reFolder selectedFolder;
        private ObservableCollection<reObject> folders;
        public ObservableCollection<reObject> Folders
        {
            get => folders;
            set
            {
                folders = value;
                OnPropertyChanged();
            }
        }
        private reFolder folderExplorer;
        public reFolder FolderExplorer
        {
            get => folderExplorer;
            set
            {
                folderExplorer = value;
                OnPropertyChanged();
            }
        }

//these methods are called from MainWindow.xaml.cs, it's the only way I've found to track nodes
        public static void NodeExpanded()
        {
            service.UpdateFolder(selectedFolder);
            service.ChangeFolderExpandedState(selectedFolder);
        }
        public static void NodeSelected(reFolder folder)
        {
            selectedFolder = folder;
            service.UpdateExplorer(selectedFolder);
        }
        public ViewModel()
        {
            folders = service.UpdateDrives();
            folderExplorer = service.UpdateExplorer(null);
        }
    }

И часть в MainWindow.xaml

        <DataGrid x:Name="Explorer" ItemsSource="{Binding FolderExplorer.FoldersFiles}" Background="{x:Null}" BorderBrush="{x:Null}" Foreground="{x:Null}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}" FontWeight="Bold" FontSize="16" IsReadOnly="True" Width="168" Foreground="#FF1BB37C"/>
            </DataGrid.Columns>
        </DataGrid>

Как я понимаю, DataGrid обновляется после вызова OnPropertyChanged (), но он вызывается только один раз в конструкторе:

folderExplorer = service.UpdateExplorer(null);

Но когда я просто выбираю что-то в TreeView во время выполнения, xaml. cs calles Метод NodeSelected:

service.UpdateExplorer(selectedFolder);

Он не вызывает setter или OnPropertyChanged при отладке, но DataGrid по-прежнему обновляется. Может кто-нибудь объяснить мне это, пожалуйста. Если вам нужно больше кода, просто скажите мне, спасибо.

1 Ответ

0 голосов
/ 26 апреля 2020

Ваш вопрос немного сложен для понимания. Я читаю это так, как будто вы задаетесь вопросом о различном поведении DataGrid по сравнению с TreeView?

Ваши ожидания верны: DataGrid обновит ячейку, если изменилось связанное свойство.
Но в вашем случае этого никогда не происходит - по крайней мере, это то, что я могу сказать из вашего опубликованного кода. В отличие от ваших утверждений, даже ваш опубликованный конструктор не вызывает событие PropertyChanged:

// Assignment of a field. Fields never raise PropertyChanged (your code)
folderExplorer = service.UpdateExplorer(null);

// Assignment of a property. Properties can raise PropertyChanged
FolderExplorer = service.UpdateExplorer(null);

Вы не опубликовали этот код, потому что считали его неважным. Поэтому я предполагаю, что вы ожидаете выполнения метода set FolderExplorer.

Но этого не происходит по уважительной причине: свойства, которые фактически редактируются и обновляются, находятся внутри коллекции FolderExplorer.FoldersFiles. Установите точку останова в классе элементов, которые содержатся в FoldersFiles свойства Name, и вы увидите, что методы набора свойств вызываются всякий раз, когда вы редактируете соответствующую ячейку DataGrid.

Если изменяется вложенное свойство, например, FolderExplorer.FoldersFiles/FolderFile.Name, то PropertyChanged только для возбуждается для фактического (вложенного) свойства, а не для всех свойств верхнего уровня вдоль пути вложенного вызов свойства.

Кроме того, ваше сравнение поведения DataGrid с поведением TreeView недопустимо. Редактирование ячейки изменяет данные, а выбор - нет. Поэтому нажатие на ячейку не вызовет никаких событий PropertyChanged. В этом случае изменение свойства произойдет только в том случае, если вы связываете DataGrid.SelectedItem со свойством ViewModel.

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