无法在DataGrid中显示记录

时间:2011-10-29 23:47:45

标签: wpf mvvm wpfdatagrid

我刚接触WPF,我在显示记录方面遇到了问题。在显示它们时,我的记录似乎很“害羞”,即使我已经记录了所有记录。

我的App.xaml.cs的代码:

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        Window1 window = new Window1();
        var viewModel = new Window1ViewModel();        

        window.PHGrid.ItemsSource = viewModel.ViewModels;
        window.Show();
    }

Window1ViewModel代码:

public class Window1ViewModel : ViewModelBase
{
    private readonly DAPHContrib _contribRepository;
    private ObservableCollection<ViewModelBase> _viewModelBases;

    public ObservableCollection<ViewModelBase> ViewModels
    {
        get
        {
            if (_viewModelBases == null)
            {
                _viewModelBases = new ObservableCollection<ViewModelBase>();
            }
            return _viewModelBases;
        }
    }

    public Window1ViewModel()
    {
        _contribRepository = new DAPHContrib();
        //Create instance of our view model to add it in our collection

        PHContribViewModel viewModel = new PHContribViewModel(_contribRepository);
        ViewModels.Add(viewModel);
    }
}

这是我的Window1.xaml 更新

<Window x:Class="Wabby_App.Views.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vm="clr-namespace:Wabby_App.ViewModels" 
    xmlns:v="clr-namespace:Wabby_App.Views" 
    Title="Utos ng mahal ko" 
    Height="300" 
    Width="300">

<Grid>
    <DataGrid 
        AutoGenerateColumns="True" 
        Height="200" 
        HorizontalAlignment="Center" 
        Name="PHGrid" 
        VerticalAlignment="Center" 
        Width="200"
        ItemsSource="{Binding ViewModels}"/>

</Grid>

输出:

My records are "shy"

希望你能帮助我。

2 个答案:

答案 0 :(得分:1)

你的View(Window1)没有绑定到ViewModel,它只是将控件的ItemsSource设置为ViewModel的一个属性,这是一种实现MVVM的错误方法。您需要做的是将Window1的DataContext设置为ViewModel的实例(将视图绑定到ViewModel)。因此,您需要使用OnStartup方法更新代码。

<强>从

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    Window1 window = new Window1();
    var viewModel = new Window1ViewModel();        

    window.PHGrid.ItemsSource = viewModel.ViewModels;
    window.Show();
}

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    Window1 window = new Window1();
    var viewModel = new Window1ViewModel();        

    window.DataContext = viewModel;
    window.Show();
}

<强>更新

您还需要在ViewModel

中将datagrid的ItemsSource属性设置为property
<DataGrid ItemsSource={Binding ViewModels} ..

答案 1 :(得分:1)

根据您的评论,您有查看模型集合(ObservableCollection<ViewModelBase>

并且在每个视图模型基本实例(PHContribViewModel)中,您有另一个集合ObservableCollection<PHContrib_Entity>

因此,您有两个级别的嵌套集合和一个要映射的数据网格。这不会起作用。为此,您需要将这个2级集合层次结构化为一个ObservableCollection<PHContrib_Entity>类型的列表。

使用LINQ来做到这一点......

 protected override void OnStartup(StartupEventArgs e) {
    base.OnStartup(e);
    Window1 window = new Window1();
    var viewModel = new Window1ViewModel();
    window.PHGrid.ItemsSource
     = viewModel.ViewModels.SelectMany(vm => vm.PHContribEntities).ToList();
    window.Show();
} 

如果这有帮助,请告诉我......