在 DataGrid 中显示带有字符串 属性 的 class 的 ObservableCollection

Display ObservableCollection of class with string property in DataGrid

我的 Movie class 有一个 ObservableCollection,它有一个字符串 属性 名称 Name,我希望它显示在 DataGrid 在 WPF 中。

<Window x:Class="MovieList.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:MovieList"
    mc:Ignorable="d"
    Title="Movie List" Height="450" Width="800">
<Grid>
    <DataGrid ItemsSource="{Binding movies}" AlternatingRowBackground="Gray" >
    </DataGrid>
</Grid>
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace MovieList
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        ObservableCollection<Movie> movies;
        public MainWindow()
        {
            movies = new ObservableCollection<Movie>();
            foreach (string dir in Directory.GetDirectories(@"F:\")) {
                movies.Add(new Movie(dir));
            }

            InitializeComponent();
        }
    }
    public class Movie
    {
        public string Name { get; set; }
        public Movie(string movieName)
        {
            Name = movieName;
        }

        
    }
}

在 MainWindow 中将 movies 设为 public 属性:

public ObservableCollection<Movie> Movies {get; private set;}

在XAML中,将window的DataContext绑定到自身,然后绑定网格:

<Window x:Class="MovieList.MainWindow"
   DataContext="{Binding RelativeSource={RelativeSource Self}}"
   ...
   >
...
<DataGrid ItemsSource="{Binding movies}" AlternatingRowBackground="Gray" >
    <DataGrid.Columns> 
        <DataGridTextColumn Header="Name" Binding ="{Binding Name}"/>
    </DataGrid.Columns> 
</DataGrid>

cannot bind to fields,将 movies 设为 public 属性 并按照惯例使用 Pascal 大小写。

public ObservableCollection<Movie> Movies { get; }

您在代码隐藏中创建了您的 Movies 集合,但是绑定在从父控件一直到您的 window 继承的 DataContext 上工作,它位于未设置。你可以在那里设置它:

DataContext="{Binding RelativeSource={RelativeSource Self}}"

或者您可以使用具有祖先类型的相对源来引用 ItemsSource 绑定中的 window。

<DataGrid ItemsSource="{Binding Movies, RelativeSource={RelativeSource AncestorType={x:Type local:MainWindowWindow}}}"
          AlternatingRowBackground="Gray">

由于 DataGrid 默认情况下会根据绑定类型的属性自动生成列,因此您不必自己创建列。但是,如果您愿意,请将 AutoGenerateColumns 设置为 false

<DataGrid ItemsSource="{Binding Movies}"
          AlternatingRowBackground="Gray"
          AutoGenerateColumns="False">
   <DataGrid.Columns>
      <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
   </DataGrid.Columns>
</DataGrid>

如果你错过了,你将有重复的列,自动生成的和你自己的。

public ObservableCollection 电影 {get;}