使用 WPF 和 MVVm 绑定 DataGrid
Bind a DataGrid using WPF with MVVm
我知道这类问题已经被问过很多次了。但我试图在不使用 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 和用户名?
像这样 ItemsSource="{Binding Source=Users}"
更改 XAMl 代码中的绑定。您不能绑定到私有字段;你必须使用 public 属性.
您还需要设置视图的 DataContext
。你做到了吗?
但是没有 INotifyProperyChanged
的 MVVM 和绑定是一个糟糕的选择。当您的 ViewModel 发生变化时,您的视图不会更新。
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 中的字段当前不会更新。
另外,为什么您将所有字段包装在属性中而没有其他任何内容!?!
您应该将视图的 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>
我知道这类问题已经被问过很多次了。但我试图在不使用 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 和用户名?
像这样 ItemsSource="{Binding Source=Users}"
更改 XAMl 代码中的绑定。您不能绑定到私有字段;你必须使用 public 属性.
您还需要设置视图的 DataContext
。你做到了吗?
但是没有 INotifyProperyChanged
的 MVVM 和绑定是一个糟糕的选择。当您的 ViewModel 发生变化时,您的视图不会更新。
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 中的字段当前不会更新。
另外,为什么您将所有字段包装在属性中而没有其他任何内容!?!
您应该将视图的 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>