Вот мой 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
каждый раз, когда я обновлял данные.
Резюмируя комментарии вы реализуете 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
не используется в вашем случае.
INotifyPropertyChanged
в классе, который работает с MoonMinerals
работает. Что касается этого примечания, хотя оно мне может понадобиться, я получаю уведомление «не могу разрешить символ», когда привязываю значение Setter
к одному из столбцов, если DataContext
не задан. Setter
все еще работает даже с этим уведомлением, поэтому я не уверен, что случилось.
MoonMinerals
и если да, будет ли оно вызывать событиеPropertyChanged
подобно свойствамMoonMineral
?