MVVM模式下如何将DataTable绑定到WPF的GridView控件?

3

我对MVVM和数据绑定都很陌生,最近在尝试动态地将GridView绑定到DataTable时遇到了一些问题。虽然能够成功绑定列标题,但是网格本身没有显示任何数据。

我的模型只是将传递给它的SQL语句的结果作为数据表返回。

我的ViewModel只是包装了数据表并与视图进行绑定。

目前,我只是通过从主窗口填充GridView来尝试显示数据,但只有标题被显示出来。

我知道模型的Results数据表中确实有数据。

我的ViewModel代码如下:

public class ResultsViewModel
{
    private DataTable _dt;

    public ResultsViewModel()
    {
        DataSource _ds = new DataSource();

        _dt = _ds.Execute("select * from tbl_users");
    }

    public DataTable Results
    {
        get { return _dt; }
        set { _dt = value; }
    }
}

我编写的代码用于从主窗口填充网格视图:

public MainWindow()
    {
        InitializeComponent();

        ResultsView view = new ResultsView();
        ResultsViewModel model = new ResultsViewModel();

        GridView Grid = new GridView();

        foreach (DataColumn col in model.Results.Columns)
        {
            Grid.Columns.Add(new GridViewColumn
            {
                Header = col.ColumnName,
                DisplayMemberBinding = new Binding(col.ColumnName)
            });
        }

        view._listView.View = Grid;
        view.DataContext = model;

        view.SetBinding(ListView.ItemsSourceProperty, new Binding());

        _placeholder.Content = view;
    }

ResultsView xaml文件:

<UserControl x:Class="InDevReporting.Views.ResultsView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <ListView x:Name="_listView" />
</Grid>

1个回答

2
尝试将您的数据上下文设置为model.Results
即更改此行:
view.DataContext = model;

转换为:

view.DataContext = model.Results;

通常情况下,您会在视图模型上创建一个依赖属性,并在XAML中指定绑定。网格应该足够聪明,能够确定要绘制哪些列:

<ListView ItemsSource="{Binding Results}" />

public MainWindow()
{
    InitializeComponent();

    // your code to instance and populate model

    this.DataContext = model;
}

public class ResultsViewModel : DependencyObject
{
    public static readonly DependencyProperty ResultsProperty = DependencyProperty.Register("Results", typeof(DataTable) , typeof(ResultsViewModel));
    public DataTable Results
    {
        get { (DataTable)GetValue(ResultsProperty); }
        set { SetValue(ResultsProperty, value); }
    }
}

我只能从记忆中打出这段代码,如果代码不完全正确,请见谅。声明一个新的依赖属性最简单的方法是使用propdp代码片段。它需要记住很多语法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接