Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用WPF和MVVm绑定数据网格_Wpf_Mvvm_Datagrid_Viewmodel - Fatal编程技术网

使用WPF和MVVm绑定数据网格

使用WPF和MVVm绑定数据网格,wpf,mvvm,datagrid,viewmodel,Wpf,Mvvm,Datagrid,Viewmodel,我知道这类问题已经被问过很多次了。但我正试图在不使用InotifyProperty或其他任何东西的情况下实现这一点。我只需要显示模型数据的普通代码。 为此,我尝试使用以下方法绑定Datagrid。 我有一个模型: public class PrimaryModel { private int _id; public int ID { get { return _id; } set { _id = value; } } p

我知道这类问题已经被问过很多次了。但我正试图在不使用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; }
    }
}
公共类PrimaryViewModel
{
私有可观察收集用户列表;
公共PrimaryViewModel()
{
_UsersList=新的ObservableCollection
{
新的PrimaryModel{ID=1,UserName=“Raghava”,Password=“Something”,CreatedDateTime=DateTime。现在,LastLoginDateTime=DateTime。现在,IsActive=true}
};
}
公共可观测收集用户
{
获取{return\u UsersList;}
设置{u 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>


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

更改XAMl代码中的绑定,如下所示
ItemsSource=“{binding Source=Users}”
。您不能绑定到私有字段;你必须使用公共财产

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

但是,没有
inotifypropertychanged
的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 }
            };
        }
    }
因为你不想用
INotifiyPropertyChanged
更新你的东西,所以把所有
Setter
设置为private,因为你的数据网格中的字段当前不更新


还有,为什么您要将所有字段包装在属性中,而不使用其他内容

应该将视图的
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>


我正在使用MVVM模式学习WPF,但对该主题没有太多知识。所以,基本上,我只是尝试用一些数据填充datagrid。我尝试按照您的建议更新代码,但仍然无法查看输出。正如我在回答中所写:您还需要设置视图的DataContext。你做到了吗?也许巴达邦说了什么。。。转到MainWindow.xaml.cs-然后转到构造函数
public MainWindow(){InitializeComponent();this.DataContext=new PrimaryViewModel();}
我尝试添加这个.DataContext=new PrimaryViewModel();但它不能识别PrimaryViewModel。这是视图模型类的名称,不是吗?
<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>