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