【问题标题】:Bind a DataGrid using WPF with MVVm使用带有 MVVm 的 WPF 绑定 DataGrid
【发布时间】:2017-10-29 11:50:10
【问题描述】:

我知道这类问题已经被问过很多次了。但我试图在不使用 InotifyProperty 或其他任何东西的情况下实现这一目标。我只想要简单的代码来显示模型中的数据。 为此,我正在尝试使用以下方法绑定 Datagrid。 我有一个模型:

public class PrimaryModel
{
    private int _id;

    public int ID
    {
        get { return _id; }
        set { _id = value; }
    }

    private string _userName;

    public string UserName
    {
        get { return _userName; }
        set { _userName = value; }
    }

    private string _password;

    public string Password
    {
        get { return _password; }
        set { _password = value; }
    }

    private DateTime _createdDateTime;

    public DateTime CreatedDateTime
    {
        get { return _createdDateTime; }
        set { _createdDateTime = value; }
    }

    private DateTime _lastLoginDateTime;

    public DateTime LastLoginDateTime
    {
        get { return _lastLoginDateTime; }
        set { _lastLoginDateTime = value; }
    }

    private bool _isActive;

    public bool IsActive
    {
        get { return _isActive; }
        set { _isActive = value; }
    }
}

一个视图模型:

public class PrimaryViewModel 
{
    private ObservableCollection<PrimaryModel> _UsersList;

    public PrimaryViewModel()
    {
        _UsersList = new ObservableCollection<PrimaryModel>
        {
            new PrimaryModel { ID=1,UserName="Raghava",Password="Something",CreatedDateTime=DateTime.Now,LastLoginDateTime=DateTime.Now,IsActive=true }
        };
    }

    public ObservableCollection<PrimaryModel> Users
    {
        get { return _UsersList; }
        set { _UsersList = value; }
    }
}

还有一个 XAML 文件:

<Window x:Class="Sample4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Sample4"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid Name="usersData" ItemsSource="{Binding Source=_UsersList}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Path=ID}" />
                <DataGridTextColumn Binding="{Binding Path=UserName}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

如何绑定 DataGrid 以通过 ViewModel 显示基本 ID 和用户名?

【问题讨论】:

    标签: wpf mvvm datagrid viewmodel


    【解决方案1】:

    您应该将视图的DataContext 设置为您的视图模型的实例。

    您可以在视图的代码隐藏中执行此操作:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new PrimaryViewModel();
        }
    }
    

    ...或在 XAML 标记中:

    <Window x:Class="Sample4.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:Sample4"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Window.DataContext>
            <local:PrimaryViewModel />
        </Window.DataContext>
        <Grid>
            <DataGrid Name="usersData" ItemsSource="{Binding Source=_UsersList}" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Path=ID}" />
                    <DataGridTextColumn Binding="{Binding Path=UserName}" />
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    

    【讨论】:

      【解决方案2】:
        public class PrimaryViewModel
          {
              public ObservableCollection<PrimaryModel> Users //Allways private set - to not destroy the Binding! Use Clear instead of reintializing !!!
              {
                  get;
                  private set;
              }
      
              public PrimaryViewModel()
              {
                  Users = new ObservableCollection<PrimaryModel>
                  {
                      new PrimaryModel { ID=1,UserName="Raghava",Password="Something",CreatedDateTime=DateTime.Now,LastLoginDateTime=DateTime.Now,IsActive=true }
                  };
              }
          }
      

      你主要是把ItemSource设置错了……

              <DataGrid Name="usersData" ItemsSource="{Binding Path=Users}" AutoGenerateColumns="False">
                  <DataGrid.Columns>
                      <DataGridTextColumn Binding="{Binding Path=ID}"/>
                      <DataGridTextColumn Binding="{Binding Path=UserName}" />
                  </DataGrid.Columns>
              </DataGrid>
      

      因为您不想使用 INotifiyPropertyChanged 更新您的内容 - 将所有 Setter 设置为私有,因为您的 DataGrid 中的字段当前不会更新。

      另外,你为什么将所有字段都包装在 Properties 中而不用别的!?!

      【讨论】:

      • 我正在学习带有 MVVM 模式的 WPF,对此主题了解不多。所以,基本上,我只是想用一些数据填充数据网格。我尝试根据您的建议更新我的代码,但仍然无法查看输出。
      • 就像我在回答中写的:您还需要设置视图的 DataContext。你做到了吗?
      • MightyBadaboom 所说的...转到 MainWindow.xaml.cs - 然后转到构造函数 public MainWindow() { InitializeComponent(); this.DataContext = new PrimaryViewModel(); }
      • 我尝试添加 this.DataContext = new PrimaryViewModel();但它无法识别 PrimaryViewModel。
      • 这是您的视图模型类的名称,不是吗?
      【解决方案3】:

      ItemsSource="{Binding Source=Users}" 这样在 XAMl 代码中更改您的绑定。您不能绑定到私有字段;你必须使用公共财产。

      您还需要设置视图的DataContext。你做到了吗?

      但是没有INotifyProperyChanged 的 MVVM 和绑定是一个糟糕的选择。当您的 ViewModel 发生更改时,您的 View 不会更新。

      【讨论】:

        猜你喜欢
        • 2018-12-28
        • 2023-03-18
        • 2018-02-07
        • 1970-01-01
        • 2021-03-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 2020-09-27
        相关资源
        最近更新 更多