我目前正试图让我的第一个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时执行?
答案 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; }
}
}