WPF 数据网格绑定不会更新
本文关键字:更新 绑定 网格 数据 数据网 WPF | 更新日期: 2023-09-27 18:20:11
这是我的DataGrid
:
<DataGrid x:Name="MoonMining"
ItemsSource="{Binding MarketData.MoonMinerals, ElementName=window}">
<DataGrid.DataContext>
<local:MoonMineral/>
</DataGrid.DataContext>
<DataGrid.Columns>
.. Yes i have columns and they are irrelevant to my question .
</DataGrid.Columns>
</DataGrid>
MarketData
是一个包含我大部分程序逻辑的类。 MoonMinerals
在该类中定义:
public class MarketData
{
private ObservableCollection<MoonMineral> _moonMinerals = new ObservableCollection<MoonMineral>();
public ObservableCollection<MoonMineral> MoonMinerals
{
get { return _moonMinerals; }
set { _moonMinerals = value; }
}
}
这是我MoonMineral
课:
[NotifyPropertyChanged]
public class MoonMineral
{
public MoonMineral()
: this("Def", "Def")
{
}
public MoonMineral(string name, string rarity)
{
Name = name;
Rarity = rarity;
}
public string Name { get; set; }
public double Price { get; set; }
public double Volume { get; set; }
public string Rarity { get; set; }
public double TransportVolume { get; set; }
public double TransportCosts { get; set; }
public double GrossProfit { get; set; }
public double NetProfit { get; set; }
}
如您所见,我正在使用PostSharp来清理我的代码,但是当我手动实现INotifyPropertyChanged
时,我遇到了同样的问题。
现在的问题是我的DataGrid
不会自行更新,我必须在修改MoonMinerals
的方法中手动调用它:
var bindingExpression = MoonMining.GetBindingExpression(ItemsControl.ItemsSourceProperty);
if (bindingExpression != null)
bindingExpression.UpdateTarget();
我知道这没什么大不了的,但我想最终设法使用 xaml 将数据完全绑定到 uu。我之前的所有尝试都涉及每次更新数据时设置DataGrids
ItemsSource
属性。
总结注释,您正在为MoonMineral
类实现INotifyPropertyChanged
接口并使用ObservableCollection
来处理对集合的更改,但似乎没有任何内容可以处理对MoonMinerals
属性的更改
private ObservableCollection<MoonMineral> _moonMinerals = new ObservableCollection<MoonMineral>();
public ObservableCollection<MoonMineral> MoonMinerals
{
get { return _moonMinerals; }
set { _moonMinerals = value; }
}
您可以在公开MoonMinerals
属性的类中实现INotifyPropertyChanged
接口,也可以将其更改为只读并仅使用_moonMinerals
的一个实例,只需清除它并添加/删除项
private readonly ObservableCollection<MoonMineral> _moonMinerals = new ObservableCollection<MoonMineral>();
public ObservableCollection<MoonMineral> MoonMinerals
{
get { return _moonMinerals; }
}
另外,作为旁注,您不需要
<DataGrid.DataContext>
<local:MoonMineral/>
</DataGrid.DataContext>
因为这会将DataGrid
DataContext
设置为MoonMineral
的新实例。当您使用 ElementName
更改ItemsSource
的绑定上下文时,它适用于您的情况DataContext
因此不会在您的情况下使用。