MVVM wpf: как я могу подключить мои ранее сделанные ObservableCollection встретить ViewModels - PullRequest
0 голосов
/ 09 января 2019

В приложении я строю. Кажется, у меня проблема в том, что моя предыдущая вставленная коллекция ObservableCollection для категорий, похоже, не переносится из ViewModel в Viewmodel.

Я пытался поместить общедоступную категорию CategoryToEdit {get; задавать; } ссылка, чтобы привязать его к моему типу как CategoryToEdit.Type Ранее это работало для меня, чтобы подключить выбранные данные из другой модели представления. Но это произошло на шаблоне без mvvm, и я не могу найти рабочее решение для него.

Это мой MainWindowViewModel:

пространство имен Webadmin.ViewModels {

  public class MainWindowViewModel

  {

    public ObservableCollection<Category> Categories { get; set; }

    public RelayCommand ChangeCategoryClick { get; set; }

    public MainWindowViewModel()
    {
        Categories = new ObservableCollection<Category>();

        ChangeCategoryClick = new RelayCommand(f => ChangeCategory(), null);

        Categories.Add(new Category() { Type = "Electronics" });
        Categories.Add(new Category() { Type = "Clothes" });
        Categories.Add(new Category() { Type = "Books" });

    }

    private void ChangeCategory()
    {        
        FilterWindow changeWindow = new FilterWindow
        {

        };          
        changeWindow.Show();
    }
}

}

Эта категория изменений просто связана с командой на кнопке, поэтому она может изменить окно. Button Content = "Change" Command = "{Binding ChangeCategoryClick}"

Это мой FilterWindowViewModel (где должны отображаться предыдущие заполненные типы):

Пространство имен Webadmin.ViewModels

{

   class FilterWindowViewModel

   {        

    public ObservableCollection<Category> Categories { get; set; }

    public ICollectionView CategoryView { get; set; }

    public FilterWindowViewModel()
    {
        Categories = new ObservableCollection<Category>();

        CategoryView = CollectionViewSource.GetDefaultView(Categories);
        CategoryView.SortDescriptions.Add(new SortDescription("Type", ListSortDirection.Ascending));
    }
}

}

Я пытаюсь отобразить свои категории в FilterWindow Datagrid с помощью
DataGrid ItemsSource = "{Binding Categories}"

Но все, что у меня получается, это пустая таблица

Пустая таблица, конечно, должна быть создана из-за ее повторного создания в FilterWindowViewModel. Но я хочу, чтобы он был подключен к основным заполненным категориям. Благодаря этому соединению я могу добавлять, удалять, редактировать эти категории, чтобы мои продукты, связанные с этими текущими категориями, могли иметь больше / меньше / других для выбора.

1 Ответ

0 голосов
/ 09 января 2019

Здесь может помочь инфраструктура MVVM. Например, в MVVM Light есть концепция Messenger, которая облегчает связь между моделями представления для этого точного сценария. Предполагается, что вы отправляете сообщение, указывающее, что ваша коллекция изменилась. Те заинтересованные ViewModels должны были зарегистрироваться, чтобы получить это сообщение.

public CategoryAddedMessage
{
    public Category AddedCategory { get; set; }
}

А затем в вашем MainWindowViewModel вам нужно будет при необходимости отключить это сообщение

public AddCategory(Category newCategoryToAdd)
{
    Categories.Add(newCategoryToAdd);
    Messenger.Default.Send<CategoryAddedMessage>(new CategoryAddedMessage {AddedCategory = newCategoryToAdd});
}

.. а затем в вашем FilterWindowViewModel нам нужно зарегистрироваться, чтобы получить это сообщение и синхронизировать его коллекцию:

public FilterWindowViewModel()
{
    Categories = new ObservableCollection<Category>();

    CategoryView = CollectionViewSource.GetDefaultView(Categories);
    CategoryView.SortDescriptions.Add(new SortDescription("Type", ListSortDirection.Ascending));

    Messenger.Default.Register<CategoryAddedMessage>(this, m => ReceiveCategoryAddedMessage(m));
}

и тогда ваш метод получения будет:

private void ReceiveCategoryAddedMessage(CategoryAddedMessage message)
{
    Categories.Add(message.AddedCategory);
}

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

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