处理UserControl的ViewModel中的DependencyProperty更改

时间:2010-07-30 14:14:23

标签: wpf delegates dependency-properties

我目前正试图让我的第一个WPF Usercontrol工作。它由一些UI元素和一个ViewModel组成,可以保存数据并完成工作。它有一个项目列表作为输入,另一个项目列表作为输出。当绑定到输入的列表发生更改时,我需要在ViewModel中完成某个任务。但是我找不到在更改此List时运行方法的方法。

我认为最好的方法是为输入和输出列表提供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 个答案:

答案 0 :(得分:1)

我会使用ObservableCollections而不是DependencyProperty中的列表。这会给你“自动”通知,等等。这里有一些可能不完全的伪代码,可以帮助你入门:

<强>视图模型

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

控件/视图中的某处

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