WPF MVVM确定模型更改时集合中的项目

时间:2013-09-24 15:11:25

标签: wpf mvvm

我有一个DataGrid绑定到Job模型列表。 Job模型具有JobName属性。

我可以判断何时选择了一行,因为设置了网格SelectedItem,但是当用户更改网格中的某些数据时,我想在视图模型中做一些事情。

当用户更改网格中活动行的JobName时,View Model如何知道它?

3 个答案:

答案 0 :(得分:1)

如果存在双向绑定,则将调用JobModel实例的JobName属性setter。如果setter引发了PropertyChanged事件,则可以通过在所选项更改时注册和取消注册处理程序来处理ViewModel中的该事件。

答案 1 :(得分:1)

您的JobName属性应该是这样的:

public string JobName
{
    get { return _jobName; }
    set
    {
        _jobName = value;
        this.OnPropertyChanged("JobName");
    }
}

当用户将其更改为datagrid时,将调用setter并在那里添加一些逻辑。绑定应为TwoWay(默认情况下),以便工作。

如果您需要在viewmodel中监听属性更改,一种简单的方法是在构造函数中添加它:

jobModel.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(JobModel_PropertyChanged);

然后在JobModel_PropertyChanged方法中,您可以检查哪个属性已更改并做出反应。

答案 2 :(得分:1)

让您的模型实现INotifyPropertyChanged。然后,当您从DAL注册作业列表时,使用propertyChanged事件处理程序

注册您的模型项

查看模型类:

public class JobsViewModel
{
    public List<Job> Jobs { get; set; }

    public JobsViewModel()
    {
        //Get your list of items and add your handler method for each item that is added
        Jobs = new List<Job>();
        Job job = new Job("Joe");
        job.PropertyChanged += job_PropertyChanged;
        Jobs.Add(job);

    }

    private void job_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        //Do stuff with job here
    }
}

职位分类:

public class Job : INotifyPropertyChanged
{
    private string _jobName;
    public string JobName 
    {
        get { return _jobName; }
        set
        {
            _jobName = value;
            OnPropertyChanged("JobName");
        }
    }

    public Job(string jobName)
    {
        JobName = jobName;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}