如何从 ViewModel 访问 ObservableCollection 中的数据

本文关键字:数据 ObservableCollection 访问 ViewModel | 更新日期: 2023-09-27 18:30:54

这可能是

一个很长的机会,但我所做的是创建一个表示数据库中表的模型。

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 | 名字 | 姓氏 | 性别 | 年龄

数据

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 访问 ObservableCollection 中的数据

我建议您先通读MSDN上的数据绑定概述页面...您需要了解数据绑定。典型的设置如下所示:

您的视图模型:

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}" />

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

DataProvider.SaveUser(SelectedUser);