WPF DataGrid绑定不会更新

时间:2014-09-01 19:55:44

标签: c# wpf datagrid

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

1 个答案:

答案 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