2014-09-01 113 views
1

这里是我的DataGridWPF的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。我之前的所有尝试都是在每次更新数据时都设置了DataGridsItemsSource属性。

+0

您是否更改'MoonMinerals'属性,如果是,它会像'MoonMineral'的属性一样引发'PropertyChanged'事件? – dkozl 2014-09-01 20:05:11

+0

我不明白MarketData在哪里.. 你可以展示这个班级吗? 为什么你的项目源绑定到ElementName = window – 2014-09-01 20:05:21

+0

@dkozl我正在使用PostSharp为我做这件事,但是,我尝试了手动提高它也没有工作。 – Krzaku 2014-09-01 20:07:49

回答

1

综上所述你实现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> 

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

+0

谢谢,在暴露MoonMinerals的类上实现了'INotifyPropertyChanged'。 虽然我注意到了这一点,但我可能仍然需要它,但如果未设置“DataContext”,我在其中一列上绑定了Setter的值时,会收到通知“无法解析符号”。即使有了这个通知,“Setter”仍然可以工作,所以我不确定发生了什么。 – Krzaku 2014-09-01 20:44:00