WPF 数据网格绑定不会更新

本文关键字:更新 绑定 网格 数据 数据网 WPF | 更新日期: 2023-09-27 18:20:11

这是我的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 将数据完全绑定到 uu。我之前的所有尝试都涉及每次更新数据时设置DataGrids ItemsSource属性。

WPF 数据网格绑定不会更新

总结注释,您正在为MoonMineral类实现INotifyPropertyChanged接口并使用ObservableCollection来处理对集合的更改,但似乎没有任何内容可以处理对MoonMinerals属性的更改

private ObservableCollection<MoonMineral> _moonMinerals = new ObservableCollection<MoonMineral>();
public ObservableCollection<MoonMineral> MoonMinerals
{
    get { return _moonMinerals; }
    set { _moonMinerals = value; }
}

您可以在公开MoonMinerals属性的类中实现INotifyPropertyChanged接口,也可以将其更改为只读并仅使用_moonMinerals的一个实例,只需清除它并添加/删除项

private readonly ObservableCollection<MoonMineral> _moonMinerals = new ObservableCollection<MoonMineral>();
public ObservableCollection<MoonMineral> MoonMinerals
{
    get { return _moonMinerals; }
}

另外,作为旁注,您不需要

<DataGrid.DataContext>
    <local:MoonMineral/>
</DataGrid.DataContext>

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