Обработка изменений DependencyProperty в ViewModel UserControl - PullRequest
0 голосов
/ 30 июля 2010

Я сейчас пытаюсь заставить мой первый WPF Usercontrol работать.Он состоит из нескольких элементов пользовательского интерфейса и ViewModel, хранящих данные и выполняющих работу.Он имеет список элементов в качестве входных данных и другой список элементов в качестве выходных данных.Мне нужно выполнить определенную задачу в моей ViewModel, когда список, связанный с входными данными, изменится.Но я не могу найти способ запустить метод при изменении этого списка.

Я подумал, что лучше всего иметь 2 свойства DependencyProperties для списка ввода и вывода.Если список вывода изменяется, связанные объекты должны быть проинформированы, поскольку он зарегистрирован как DependencyProperty.И я хотел использовать делегат DependencyPropertyChanged, чтобы указать метод в моей ViewModel для выполнения при изменении ввода.

public List<AClass> Input
    {
        get { return (List<AClass>)GetValue(InputProperty); }
        set { SetValue(InputProperty, value); }
    }
public static readonly DependencyProperty InputProperty =
        DependencyProperty.Register("Input", typeof(List<AClass>), typeof(MyUserControl), new UIPropertyMetadata(new List<AClass>(),CallBackDelegate));

Я пробовал разные подходы для установки делегата в конструкторе viewmodel, но все они не работали.Как я могу указать метод в моей viewmodel для выполнения при изменении ввода List?

1 Ответ

1 голос
/ 30 июля 2010

Вместо списков в DependencyProperty я бы использовал ObservableCollections. Это дает вам «автоматические» уведомления и т. Д. Вот вам, пожалуй, не совсем полный псевдокод, который может вам помочь:

ViewModel

using System.Collections.ObjectModel;

namespace MyNamespace;

class MyViewModel
{
    ObservableCollection<AClass> mInput = new ObservableCollection<AClass>();
    ObservableCollection<AClass> mOutput = new ObservableCollection<AClass>();

    public MyViewModel()
    {
        mInput.CollectionChanged += 
            new NotifyCollectionChangedEventHandler(mInput_CollectionChanged);
    }

    void mInput_CollectionChanged(object sender, 
                                  NotifyCollectionChangedEventArgs e)
    {
        DoSomething();    
    }

    public ObservableCollection<AClass> Input
    {
        get { return mInput; }
    }

    public ObservableCollection<AClass> Output
    {
        get { return mOutput; }
    }
}

Где-то в Control / View

<ItemsControl ItemsSource="{Binding Input}">
    <!-- Rest of control design goes here -->
</ItemsControl>

<ItemsControl ItemsSource="{Binding Output}">
    <!-- Rest of control design goes here -->
</ItemsControl>

Контроль / просмотр кода позади

class MyViewOrControl
{
    // ViewModel member
    private readonly MyViewModel mViewModel = new MyViewModel();

    // Constructor
    public MyViewOrControl()
    {
        InitializeComponent();
        this.DataContext = mViewModel;
    }

    // Property (if needed)
    public ViewModel
    {
        get { return mViewModel; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...