这是我的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>


因为这会将DataContextDataGrid设置为MoonMineral的新实例。当您使用ItemsSource更改ElementName的绑定上下文时,它适用于您的情况,因此在您的情况下不使用DataContext

09-13 06:30