我在其他帖子中读过,可以在XAML中指定代替在其后面的代码中指定DataContext。
我在我的主类的构造函数中声明并填充了一个ObservableCollection,我也设置了DataContext:
using System;
using System.Windows;
using System.Collections.ObjectModel;
namespace ItemsControlDemo
{
public partial class MainWindow : Window
{
public ObservableCollection<Person> PersonList { get; set; }
public MainWindow()
{
InitializeComponent();
PersonList = new ObservableCollection<Person>();
PersonList.Add(new Person(16, "Abraham", "Lincoln"));
PersonList.Add(new Person(32, "Franklin", "Roosevelt"));
PersonList.Add(new Person(35, "John", "Kennedy"));
PersonList.Add(new Person(2, "John", "Adams"));
PersonList.Add(new Person(1, "George", "Washington"));
PersonList.Add(new Person(7, "Andrew", "Jackson"));
DataContext = this;
}
private void Button_Add_Click(object sender, RoutedEventArgs e)
{
PersonList.Add(new Person(3, "Thomas", "Jefferson"));
}
private void Button_Remove_Click(object sender, RoutedEventArgs e)
{
PersonList.Remove(TheDataGrid.SelectedItem as Person);
}
}
public class Person
{
public Person() { }
public Person(int id, string firstName, string lastName)
{
ID = id;
FirstName = firstName;
LastName = lastName;
}
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
}
如果我这样做,一切都适用于我的应用程序。
但是,如果我删除“DataContext = this;”从构造函数中,而不是在我的应用程序的Window元素中设置DataContext
DataContext="{Binding RelativeSource={RelativeSource Self}}"
我没有数据。
这是我从后面的代码中删除DataContext后设置DataContext的XAML:
<Window x:Class="ItemsControlDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ItemsControlDemo"
Title="Items Control Demo" Height="350" Width="400"
WindowStartupLocation="CenterScreen"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<DataGrid Grid.Row="0" Name="TheDataGrid" SelectedValuePath="ID"
AutoGenerateColumns="False"
AlternatingRowBackground="Bisque"
ItemsSource="{Binding PersonList}">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Path=ID}"/>
<DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}"/>
<DataGridTextColumn Header="Last Name" Binding="{Binding Path=LastName}"/>
</DataGrid.Columns>
</DataGrid>
<StackPanel Grid.Row="1" Orientation="Horizontal"
HorizontalAlignment="Left" VerticalAlignment="Bottom">
<Button Content="Add Item" Margin="5" Click="Button_Add_Click"/>
<Button Content="Remove Item" Margin="5" Click="Button_Remove_Click"/>
</StackPanel>
</Grid>
</Window>
对我所做错误的任何帮助都将不胜感激。
谢谢!
答案 0 :(得分:2)
您需要在调用InitializeComponent
之前设置源编辑:实际上你只需要在InitializeComponent之前实例化它,因为它是一个ObservableCollection它实现了INotifyCollectionChanged,所以如果你修改了这个集合,你的网格将会随着这些变化而更新。
public MainWindow()
{
PersonList = new ObservableCollection<Person>();
InitializeComponent();
PersonList.Add(new Person(16, "Abraham", "Lincoln"));
PersonList.Add(new Person(32, "Franklin", "Roosevelt"));
PersonList.Add(new Person(35, "John", "Kennedy"));
PersonList.Add(new Person(2, "John", "Adams"));
PersonList.Add(new Person(1, "George", "Washington"));
PersonList.Add(new Person(7, "Andrew", "Jackson"));
}
答案 1 :(得分:2)
INotifyPropertyChanged
,以便在设置PersonList
时通知XAML。
ObservableCollection
仅在集合中项目更改时通知。如果您想在为信息分配新值时通知(例如PersonList = new ObservableCollection<Person>()
),则需要实施INotifyPropertyChanged
。
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection<Person> personList;
public ObservableCollection<Person> PersonList
{
get { return personList; }
set
{
if (value == personList)
return;
personList = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("PersonList"));
}
}
public MainWindow()
{
InitializeComponent();
PersonList = new ObservableCollection<Person>();
// etc.
}
}