替换 ObservableCollection 后刷新 WPF DataView
Refreshing WPF DataView after replacing ObservableCollection
我有 3 个 returns 列表集合的方法,我无法更改它们。
List<Person> GetListPerson()
{
List <Person> list = new List<Person>();
list.Add(new Person { FirstName = "Judge", LastName = "Mental" });
list.Add(new Person { FirstName = "Office", LastName = "Rocker" });
list.Add(new Person { FirstName = "Sir", LastName = "Real" });
return list;
}
List<Person> GetOnePerson()
{
List<Person> list = new List<Person>();
list.Add(new Person { FirstName = "Josh", LastName = "Smith" });
return list;
}
List<Person> ClearPerson()
{
List<Person> list = new List<Person>();
return list;
}
在我的 XAML 中,我有一个 3 个按钮和一个绑定到可观察集合的网格
<Window x:Class="WpfApplication.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:WpfApplication"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<Button Name="GetList" Height="30" Content="GetList" Click="GetList_Click" />
<Button Name="GetOne" Height="30" Content="GetOne" Click="GetOne_Click"/>
<Button Name="Clear" Height="30" Content="Clear" Click="Clear_Click" />
<DataGrid x:Name="dataGrid" Height="230" ItemsSource="{Binding}" />
</StackPanel>
这是背后的代码:
private ObservableCollection<Person> _pObsList;
public ObservableCollection<Person> PObsList
{
get { return _pObsList; }
set { _pObsList = value;
this.OnPropertyChanged("PObsList");
}
}
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(
this, new PropertyChangedEventArgs(propName));
}
public MainWindow()
{
InitializeComponent();
PObsList = new ObservableCollection<Person>();
dataGrid.DataContext = PObsList;
}
private void GetList_Click(object sender, RoutedEventArgs e)
{
PObsList = new ObservableCollection<Person>(GetListPerson());
}
private void GetOne_Click(object sender, RoutedEventArgs e)
{
PObsList = new ObservableCollection<Person>(GetOnePerson());
}
private void Clear_Click(object sender, RoutedEventArgs e)
{
PObsList = new ObservableCollection<Person>(ClearPerson());
}
当应用程序为运行时,网格将按预期显示列但没有记录;但是如果单击 GetList 按钮,我的 Observable 集合将包含 3 个元素,但 DataGrid 将保持为空。
通过阅读其他链接,我似乎需要在 Collection 上实现 PropertyChanged,但我认为还缺少其他内容。
无法将 Lists 更改为 Observable 集合,我正在尝试不清除并手动添加它们。
有什么想法或帮助吗?
我认为问题出在 DataContext
。当您在 3 个事件处理程序中的任何一个中更改 PObsList
时,您只需为 PObsList
设置一个新值,DataContext
将保持原来的 PObsList
。我建议使用带有 ObservableCollection
属性 的单独对象(视图模型)用作 DataContext
,而不是直接使用 ObservableCollection
。
在点击处理程序中,您覆盖了 PObsList
变量。
清除列表并从以下方法添加新项目:
PObsList.Clear();
PObsList.AddRange(GetListPerson());
如果你在
中放置一个断点
public MainWindow()
{
InitializeComponent();
PObsList = new ObservableCollection<Person>();
dataGrid.DataContext = PObsList;
}
您会看到 PObsList 是空的。
当您按下 GetList 按钮时,您的列表不是空的,因为您的方法 GetListPerson return 是一个包含值的列表。
您可以改为:
public MainWindow()
{
InitializeComponent();
PObsList = new ObservableCollection<Person>();
PObsList.AddRange(GetPersonList());
dataGrid.DataContext = PObsList;
}
我有 3 个 returns 列表集合的方法,我无法更改它们。
List<Person> GetListPerson()
{
List <Person> list = new List<Person>();
list.Add(new Person { FirstName = "Judge", LastName = "Mental" });
list.Add(new Person { FirstName = "Office", LastName = "Rocker" });
list.Add(new Person { FirstName = "Sir", LastName = "Real" });
return list;
}
List<Person> GetOnePerson()
{
List<Person> list = new List<Person>();
list.Add(new Person { FirstName = "Josh", LastName = "Smith" });
return list;
}
List<Person> ClearPerson()
{
List<Person> list = new List<Person>();
return list;
}
在我的 XAML 中,我有一个 3 个按钮和一个绑定到可观察集合的网格
<Window x:Class="WpfApplication.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:WpfApplication"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<Button Name="GetList" Height="30" Content="GetList" Click="GetList_Click" />
<Button Name="GetOne" Height="30" Content="GetOne" Click="GetOne_Click"/>
<Button Name="Clear" Height="30" Content="Clear" Click="Clear_Click" />
<DataGrid x:Name="dataGrid" Height="230" ItemsSource="{Binding}" />
</StackPanel>
这是背后的代码:
private ObservableCollection<Person> _pObsList;
public ObservableCollection<Person> PObsList
{
get { return _pObsList; }
set { _pObsList = value;
this.OnPropertyChanged("PObsList");
}
}
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(
this, new PropertyChangedEventArgs(propName));
}
public MainWindow()
{
InitializeComponent();
PObsList = new ObservableCollection<Person>();
dataGrid.DataContext = PObsList;
}
private void GetList_Click(object sender, RoutedEventArgs e)
{
PObsList = new ObservableCollection<Person>(GetListPerson());
}
private void GetOne_Click(object sender, RoutedEventArgs e)
{
PObsList = new ObservableCollection<Person>(GetOnePerson());
}
private void Clear_Click(object sender, RoutedEventArgs e)
{
PObsList = new ObservableCollection<Person>(ClearPerson());
}
当应用程序为运行时,网格将按预期显示列但没有记录;但是如果单击 GetList 按钮,我的 Observable 集合将包含 3 个元素,但 DataGrid 将保持为空。
通过阅读其他链接,我似乎需要在 Collection 上实现 PropertyChanged,但我认为还缺少其他内容。
无法将 Lists 更改为 Observable 集合,我正在尝试不清除并手动添加它们。
有什么想法或帮助吗?
我认为问题出在 DataContext
。当您在 3 个事件处理程序中的任何一个中更改 PObsList
时,您只需为 PObsList
设置一个新值,DataContext
将保持原来的 PObsList
。我建议使用带有 ObservableCollection
属性 的单独对象(视图模型)用作 DataContext
,而不是直接使用 ObservableCollection
。
在点击处理程序中,您覆盖了 PObsList
变量。
清除列表并从以下方法添加新项目:
PObsList.Clear();
PObsList.AddRange(GetListPerson());
如果你在
中放置一个断点public MainWindow()
{
InitializeComponent();
PObsList = new ObservableCollection<Person>();
dataGrid.DataContext = PObsList;
}
您会看到 PObsList 是空的。
当您按下 GetList 按钮时,您的列表不是空的,因为您的方法 GetListPerson return 是一个包含值的列表。
您可以改为:
public MainWindow()
{
InitializeComponent();
PObsList = new ObservableCollection<Person>();
PObsList.AddRange(GetPersonList());
dataGrid.DataContext = PObsList;
}