这是我的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
属性。
答案 0 :(得分:3)
总结评论,你正在为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
的{{1}}设置为MoonMineral
的新实例。当您使用ItemsSource
更改ElementName
的绑定上下文时,它适用于您的情况,因此在您的情况下不使用DataContext
。