首页 文章

MVVM gridview绑定到数据表WPF

提问于
浏览
3

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

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

现在我只是试图通过从主窗口填充gridview来显示数据,但只显示 Headers .

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

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

我的代码从主窗口填充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 回答

  • 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 代码段 . 这是记忆的很多语法 .

相关问题