У меня есть «главный список» всех существующих предметов. Затем у меня есть класс (называемый Inventory), который отвечает за отслеживание количества элементов, количество может быть любым целым числом.
My DataGrid привязывается к главному списку, а затем к конкретному * Столбец 1029 * отвечает за отображение количества предметов в инвентаре. Класс Inventory - это IValueConverter.
Моя идея состоит в том, чтобы преобразовать Item из DataGrid в int (количество имеющихся у меня элементов) с помощью класса Inventory.
XAML:
<UserControl>
<UserControl.Resources>
<converters:Inventory x:Key="FindQuantity"/>
</UserControl.Resources>
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding MasterList}"> <!-- Binding to the master List -->
<DataGrid.Columns>
<DataGridTemplateColumn Header="Quantity">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<!-- Converting: -->
<TextBlock Text="{Binding Converter={StaticResource FindQuantity}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</UserControl>
Часть скрипта инвентаризации:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var item = (Item)value; //<------------Here's where the Debug points the error
return HowMany(item);
}
public int HowMany(Item item)
{
if (storage.ContainsKey(item))
return storage[item];
else return 0;
}
Я получаю ошибку:
System.InvalidCastException: 'Невозможно преобразовать объект типа' MS.Internal .NamedObject ', чтобы ввести' Playfield2_WPF.Objetos.Item '.'
Я новичок в WPF, поэтому не совсем понимаю привязку. Где моя ошибка? У меня что-то не так с работой привязок или проблема в другом? Спасибо.
Изменить:
Вот код для «MasterList» (это список ObservableObject, класса, реализующего INotifyPropertyChanged. Исходный код: https://pastebin.com/wZiis6rF)
public class Inventary : ObservableObject, IValueConverter
{
private List<Item> _masterList;
public List<Item> MasterList
{
get { return _masterList; }
set
{
//this method is from the ObservableObjet class
//It basically calls PropertyChanged from the INotifyPropertyChanged interface
OnPropertyChanged(ref _masterList, value, nameof(MasterList));
}
}
}
//Item is basically some int and string propierties
public class Item : ObservableObject
{
private string _name;
public string Name
{
get { return _name; }
set
{
OnPropertyChanged(ref _name, value, nameof(Name));
}
}
private decimal _cost;
public decimal Cost
{
get { return _cost; }
set
{
OnPropertyChanged(ref _cost, value, nameof(Cost));
}
}
}