Как добавить элементы в свойство ViewModel ObservableCollection из элемента управления списком? WPF MVVM - PullRequest
0 голосов
/ 03 мая 2018

Это мой первый проект MVVM, надеюсь, все будет понятно.
Имея это в модели:

public class Category
{
    public int CategoryId { get; set; }
    public string Description { get; set; }
}

В ViewModel:

public class CategoryViewModel : MyViewModelBase
{
    private ObservableCollection<Category> categories;

    public ObservableCollection<Category> Categories
    {
        get { return categories; }

        set
        {
            categories = value;
            NotifyPropertyChanged(nameof(Categories));
        }
    }
}

Просмотр (XAML)
Элементы привязаны к ComboBox:

<ComboBox x:Name="cboCategories"
          HorizontalAlignment="Left
          VerticalAlignment="Top"
          Width="250"
          IsEditable="True"
          ItemsSource="{Binding Categories}"
                      SelectedValuePath="CategoryId"
                      DisplayMemberPath="Description" />

Есть ли способ добавить новый элемент (категорию) в свойство ObservableCollection, когда пользователь записывает новую запись в элемент управления?

Я смог сделать это, показав немного Window с TextBox, но я хотел бы знать, возможно ли сократить этот процесс.
Я не очень знаком с WPF, любая помощь будет признательна.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы можете обработать прикрепленное событие TextBoxBase.TextChanged и, например, вызвать команду модели представления или напрямую добавить элемент в ObservableCollection, например ::

.
private void cboCategories_TextChanged(object sender, TextChangedEventArgs e)
{
    var cmb = sender as ComboBox;
    var viewModel = DataContext as CategoryViewModel;
    if (viewModel != null)
    {
        viewModel.Categories.Add(new Category() { Description = cmb.Text });
    }
}

XAML:

<ComboBox x:Name="cboCategories"
          IsEditable="True"
          TextBoxBase.TextChanged="cboCategories_TextChanged" ... />

Если вы хотите вызвать присоединенную команду, используя триггер взаимодействия, вы можете создать свой собственный EventTrigger, как предлагается здесь:

http://joyfulwpf.blogspot.se/2009/05/mvvm-invoking-command-on-attached-event.html

https://social.msdn.microsoft.com/Forums/vstudio/en-US/c3e9fad4-16ee-4744-8b0e-1ea0abfc5da7/how-to-handle-scrollviewerscrollchanged-event-in-mvvm?forum=wpf

0 голосов
/ 03 мая 2018

Скажем, у вас была одна коллекция Категорий, и она связана с источником предметов вашего комбо.
Затем вы привязываете selecteditem к свойству типа Category с помощью propfull, чтобы у вас был установщик, куда вы можете поместить код. Когда этот сеттер срабатывает, вы получаете выбранную категорию.
Тогда вы можете делать то, что вам нравится.
Одним из вариантов было бы добавить его к другой наблюдаемой коллекции.

Шаблон действия при выборе элемента из списка описан здесь:
https://social.technet.microsoft.com/wiki/contents/articles/30564.wpf-uneventful-mvvm.aspx#Select_From_List_IndexChanged

В этом случае вы добавили бы шеф-повара к другой наблюдаемой коллекции в DoSomethingWhenChefChanged.

...