如何从ViewModel访问ObservableCollection中的数据?

时间:2014-11-18 13:09:28

标签: c# wpf mvvm

这可能是一个很长的镜头,但我所做的是创建一个代表我的数据库中的表的模型。

public partial class users
{
    public int id { get; set }
    public string firstName { get; set; }
    public string surname { get; set; }
    public string gender { get; set; }
    public string age { get; set; }
}

我的数据库看起来像这样,具有以下值 图书:

  
    

id | firstName | surName |性别|年龄

  

数据

  
    

1 |约翰|史密斯|男| 32

         

2 |布拉德|里德|男| 28

         

3 |提图斯|沃德|男| 25

         

4 |赛斯|肖|男| 26

  

因为我正在尝试使用mvvm模式,所以我有一个视图模型。此视图模型具有一个可观察的集合,表示声明的上述模型。它还有五个属性,每个属性分别代表表中的一个字段,这是问题所在的地方;

public class ViewModel
{
    #region ObservableCollection

    private ObservableCollection<users> _user;
    public ObservableCollection<users> User
    {
        get { return _user; }
        set
        { if (_user != value)
                value = _user;
          OnPropertyChanged("User"); }
    }

    #endregion

    #region Properties

    private string _id;
    public string Id
    {
        get { return _id; }
        set { if (value != _id)
                _id= value;
        OnPropertyChanged("Id");
        }
    }

    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set { if (value != _firstName)
                _firstName = value;
        OnPropertyChanged("FirstName");
        }
    }

    private string _surName;
    public string SurName
    {
        get { return _surName; }
        set { if (value != _surName)
                _surName = value;
        OnPropertyChanged("SurName");
        }
    }

    private string _gender;
    public string Gender
    {
        get { return _gender; }
        set { if (value != _gender )
                _gender = value;
        OnPropertyChanged("Gender");
        }
    }

    private string _age;
    public string Age
    {
        get { return _age; }
        set { if (value != _age )
                _age = value;
        OnPropertyChanged("Age");
        }
    }

通常,如果您想在UserControl中传达这些细节,您需要创建一个DataGrid,将它的ItemSource绑定到ObservableCollection(在我的情况下为'User'),然后将其列绑定到模型内的属性。那会很好。

然而,我需要的是我的ViewModel中的属性包含所选记录并将我的UI元素(例如文本框)绑定到视图模型的属性。这是因为我需要VM根据当时选择的人进行相当多的查询。例如,将当前用户完全保存到另一个表。

像我说的那样。这是一个很长的镜头。可以这样做吗?我想我现在的思考逻辑是,如果视图可以访问这些数据,那么为什么ViewModel不会。

1 个答案:

答案 0 :(得分:3)

我建议您首先阅读MSDN上的Data Binding Overview页面...您需要了解数据绑定。典型的设置如下:

您的观看模型:

public ObservableCollection<User> Users
{
    get { return users; }
    set { users = value; NotifyPropertyChanged("Users"); }
}

public User SelectedUser
{
    get { return user; }
    set { user = value; NotifyPropertyChanged("SelectedUser"); }
}

您的观点:

<ListBox ItemsSource="{Binding Users}" SelectedItem="{Binding SelectedUser}" />

现在,当应用程序用户更改User中选定的ListBox时,SelectedUser属性将更新以反映出来。因此,当他们点击保存Button时,您可能会执行以下操作:

DataProvider.SaveUser(SelectedUser);