MVVM gridview绑定到数据表WPF

时间:2011-06-30 16:43:55

标签: wpf gridview mvvm binding datatable

我是MVVM和数据绑定的新手,我在将gridview动态绑定到数据表时遇到了一些麻烦。我能够将列标题绑定,但网格本身没有显示任何数据。

我的模型只是返回一个数据表,作为传递给它的SQL字符串的结果。 我的viewmodel只是包装数据表并绑定到视图。

现在我只想通过从主窗口填充gridview来显示数据,但只显示标题。

我知道模型中有数据。但结果数据表。

我的观点模型:

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; }
    }
}

我的代码从主窗口填充gridview:

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 个答案:

答案 0 :(得分: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代码段。这是记忆的很多语法。