Привязка WPF DataGrid не обновляется

1

Вот мой 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();

Я знаю, что это не большая сделка, но я хотел, наконец, полностью связать данные с ui, используя xaml. Все мои предыдущие попытки включали определение свойства DataGrids ItemsSource каждый раз, когда я обновлял данные.

  • 0
    Измените ли вы свойство MoonMinerals и если да, будет ли оно вызывать событие PropertyChanged подобно свойствам MoonMineral ?
  • 0
    я не понимаю, где MarketData .. не могли бы вы показать класс. и почему источник вашего элемента привязан к ElementName = window
Показать ещё 7 комментариев
Теги:
wpf
datagrid

1 ответ

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>

поскольку это установит DataContext DataGrid в новый экземпляр MoonMineral. Он работает в вашем случае, когда вы меняете контекст привязки ItemsSource используя ElementName поэтому DataContext не используется в вашем случае.

  • 0
    Спасибо, реализация INotifyPropertyChanged в классе, который работает с MoonMinerals работает. Что касается этого примечания, хотя оно мне может понадобиться, я получаю уведомление «не могу разрешить символ», когда привязываю значение Setter к одному из столбцов, если DataContext не задан. Setter все еще работает даже с этим уведомлением, поэтому я не уверен, что случилось.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню