这是我的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将数据绑定到ui。我以前的所有尝试都涉及每次我更新数据时都设置
DataGrids
ItemsSource
属性。 最佳答案
总结一下注释,您正在为INotifyPropertyChanged
类实现MoonMineral
接口,并使用ObservableCollection
可以处理对集合的更改,但是似乎没有任何地方可以处理对MoonMinerals
属性的更改
private ObservableCollection<MoonMineral> _moonMinerals = new ObservableCollection<MoonMineral>();
public ObservableCollection<MoonMineral> MoonMinerals
{
get { return _moonMinerals; }
set { _moonMinerals = value; }
}
您可以在暴露
INotifyPropertyChanged
属性的类中实现MoonMinerals
接口,也可以将其更改为只读并仅使用_moonMinerals
的一个实例,然后简单地清除它并添加/删除项目private readonly ObservableCollection<MoonMineral> _moonMinerals = new ObservableCollection<MoonMineral>();
public ObservableCollection<MoonMineral> MoonMinerals
{
get { return _moonMinerals; }
}
另外,作为旁注,您不需要
<DataGrid.DataContext>
<local:MoonMineral/>
</DataGrid.DataContext>
因为这会将
DataContext
的DataGrid
设置为MoonMineral
的新实例。当您使用ItemsSource
更改ElementName
的绑定上下文时,它适用于您的情况,因此在您的情况下不使用DataContext
。