如何使 WPF DataGrid 显示具有绑定和 DataTemplate 的 ViewModel 集合

问题描述 投票:0回答:2

我只是希望在

DataGrid
内显示某种列表的内容。我目前正在尝试使用
ObservableCollection<>
DataGrid
,但这可能会改变。如何使用 DataTemplate 列表并显示它?

该列表位于 ViewModel 中,该视图模型已在 Apps.xaml.cs 中设置为 MainWindow.xaml 的数据源:

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

    var window = new MainWindow();

    // Create the ViewModel to which 
    // the main window binds.
    var viewModel = new MainWindowViewModel();

    // Allow all controls in the window to 
    // bind to the ViewModel by setting the 
    // DataContext, which propagates down 
    // the element tree.
    window.DataContext = viewModel;

    window.Show();
}

这是当前列表:

    public ObservableCollection<PersonData> SearchResults { get; set; }
    

对于我的 xaml,我相当迷失——我尝试摆弄绑定和 ItemsSource,但真的不知道如何在这里使用它们。另外,我认为使用 DataTemplate 是必要的,因为我需要以某种方式让它知道列需要显示 PersonData 的某些属性,例如名字和姓氏、位置和标题。如有任何帮助,我们将不胜感激。

编辑

更一般地说,如何简单地显示 ViewModel 列表、集合,等等?

wpf mvvm datagrid datatemplate observablecollection
2个回答
12
投票

您的基本

DataGrid
语法应如下所示:

<DataGrid ItemsSource="{Binding SearchResults}"
          AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="First Name"  Binding="{Binding FirstName}"/>
        <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" />
    </DataGrid.Columns>
</DataGrid>

如果您不想在

DataGrid
中显示数据,可以使用 ItemsControl

默认的

ItemsControl
会将所有项目添加到
StackPanel
中,并使用绑定到项目
TextBlock
.ToString()
绘制每个项目。您可以通过指定您自己的
ItemsControl
ItemsPanelTemplate
来更改
ItemTemplate
显示项目的方式以供其使用。有关一些示例,请查看我关于 WPF 的 ItemsControl 的博客文章


1
投票

阿赫。预习失败是致命的——我没有实现INotifyPropertyChanged。在这里找到了如何操作:http://msdn.microsoft.com/en-us/library/ms743695

© www.soinside.com 2019 - 2024. All rights reserved.