【问题标题】:Populate a DataGrid using ViewModel via a database通过数据库使用 ViewModel 填充 DataGrid
【发布时间】:2015-11-26 02:07:45
【问题描述】:

基本上,我要处理 4 个文件:

DBDisplay.xaml

DBDisplay.xaml.cs

DBDisplayViewModel.cs

DBConn.cs

在我的 ViewModel 中,我试图从我的 .xaml 文件中填充以下 DataGrid:

<DataGrid ItemsSource="{Binding Path=Users}"/>

使用以下代码:

public class DBDisplayViewModel
{
    public ICollectionView Users { get; set; }

    DBConn dbCon;   // the connection object
    DataSet dataSet;
    DataRow dataRow;

    private void Load()
    {
        string connectionString = Properties.Settings.Default.UserDB;

        dbCon = new DBConn(connectionString);

        dbCon.openConnection();

        dataSet = dbCon.getDataSet(Queries.SelectAll);

        DataTable table = dataSet.Tables[0];
        PopulateTextFields(table, 1);

        //Something to go here to populate the DataGrid

    }

    private void PopulateTextFields(DataTable table, int i)
    {
        dataRow = table.Rows[i];

    }

   public DBDisplayViewModel()
   {

       Load();

       Users = CollectionViewSource.GetDefaultView(SOMETHING_HERE);
   }

    private void Closed(object sender, EventArgs e)
    {
        dbCon.closeConnection();
    }

}

所以SOMETHING_HERE 应该链接到我的数据库(因为这是我之前连接到用户列表的方式) 另外我想我需要类似的东西

DataGrid.DataSource = table;  //DataGrid would be linking to the xaml code

填充数据网格

我就到这里了,如果有人能帮忙,我会很高兴的!

【问题讨论】:

    标签: c# wpf xaml mvvm datagrid


    【解决方案1】:

    由于您是 WPF 的新手,所以我会保持简单。要显示记录列表,您需要一个集合。您可以使用以下代码获取此集合:

    Users = CollectionViewSource.GetDefaultView(dataset1.Tables[0].DefaultView);

    【讨论】:

      【解决方案2】:

      恐怕您不会采用 MVVM 方式。我将简单地解释。理想情况下,您应该有一个模型类,并且该类对象的集合应该由您的数据访问代码返回。更重要的是,您的视图模型具有不应承担的多重责任(从 SOLID 原则中读取 S)。它应该负责更改 UI 状态和/或在 View 上显示数据。应该有一个单独的类,它将从数据库中获取数据到 ViewModel。

      DBDisplay.xaml.cs

      public DBDisplay() 
      {
          InitializeComponent();
      
          var viewModel = new DBDisplayViewModel();
          viewModel.UserRepository = new UserRepository(); // You could use dependency injection but I left for simplicity.
          this.DataContext = viewModel;
      }
      

      DBDisplayViewModel.cs

      public class DBDisplayViewModel
      {
          private ObservableCollection<User> users;
      
          public DBDisplayViewModel() {
              Load();
          }
      
          public IUserRepository UserRepository
          {
              get; set;
          }
      
          public ObservableCollection<User> Users
          {
              get {
                  if(users == null) {
                      users = new ObservableCollection<User>();
                  }
      
                  return users;
              }
              set {
                  if(value != null) {
                      users = value;
                  }
              }
          }
      
          private void Load() {
              List<User> users = UserRepository.GetUsers();
              Users = new ObservableCollection<User>(users);
          }
      }
      

      IUserRepository.cs

      public interface IUserRepository
      {
         List<User> GetUsers();
      }
      

      UserRepository.cs

      public class UserRepository : IUserRepository
      {
          public List<User> GetUsers() {
              List<User> users;
              // put your data access code here
              // and transform list of user model using dataset or SQL data reader.
              return users;
          }
      }
      

      User.cs(这是模型)

      public class User
      {
          // some properties
      }
      

      【讨论】:

      • @Badja 是的,我的意思是您为从数据库中检索数据而编写的代码。这包括连接、命令、数据表/数据集填充等。
      • 我已经完成了你给我的工作,但它说找不到IUserRepository。我确保它在 ViewModel 和 UserRepository 中都正确...
      • IUserRepository 只是一个Interface。我已经更新了我的答案。
      • 我希望你仍然可以帮助我。我回到了项目,我不知道如何使用适当的数据库信息填充List&lt;User&gt; users。请记住,我确实有一个工作数据库和连接,我只是不确定将它放在哪里,或者数据库中的 ID FirstNameLastName 的实例
      猜你喜欢
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 2020-11-28
      相关资源
      最近更新 更多