【发布时间】:2021-04-15 21:38:47
【问题描述】:
WPF 新手并在此处编程我正在尝试更新 ListView 中的项目,如果该项目已存在于 ListView 中,则按下按钮时,例如用户输入 CAR 并且 CAR 已在 ListView 中,CAR 计数应从 1 到 2。
这是我的 InventoryItem 类:
public class InventoryItem
{
public string Name { get; set; }
public int Count { get; set; }
}
这是我的视图模型
public class ViewModel : ViewModelBase
{
private InventoryItem _item;
private int _count;
private ObservableCollection<InventoryItem> _inventoryItems;
private ICommand _addItem;
public InventoryItem Item
{
get
{
return _item;
}
set
{
_item = value;
NotifyPropertyChanged("Item");
}
}
public int Count
{
get { return _count; }
set { _count = value; NotifyPropertyChanged("Count"); }
}
public ObservableCollection<InventoryItem> InventoryItems
{
get
{
return _inventoryItems;
}
set
{
_inventoryItems = value;
NotifyPropertyChanged("Items");
}
}
public ICommand AddItem
{
get
{
if (_addItem == null)
{
_addItem = new RelayCommand(ParamArrayAttribute => this.Submit(), null);
}
return _addItem;
}
}
public ViewModel()
{
Item = new InventoryItem();
InventoryItems = new ObservableCollection<InventoryItem>();
InventoryItems.CollectionChanged += new NotifyCollectionChangedEventHandler(InventoryItems_CollectionChanged);
}
void InventoryItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
NotifyPropertyChanged("Items");
NotifyPropertyChanged("Count");
}
private void Submit()
{
if (InventoryItems.Any(p => p.Name == Item.Name))
{
InventoryItems.First(x => x.Name == Item.Name).ItemCount++;
}
else
{
InventoryItems.Add(Item);
}
}
}
这是我的观点
<ListView x:Name="listBox" ItemsSource="{Binding InventoryItems}" Grid.Row="0" HorizontalAlignment="Stretch" Height="Auto" Margin="10,10,10,60" VerticalAlignment="Stretch">
<ListView.Resources>
<Style TargetType="GridViewColumnHeader">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
</ListView.Resources>
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Name}" Width="Auto"/>
<GridViewColumn DisplayMemberBinding="{Binding ItemCount}" Width="Auto"/>
</GridView>
</ListView.View>
</ListView>
只要输入列表中存在的项目,就会显示 InventoryItems ObservableCollection 正在更新,但未触发 InventoryItems_CollectionChanged 事件,因此未更新 ListView。集合不是在改变,所以应该触发事件来更新 ListView 还是我不理解绑定和事件?
【问题讨论】:
-
在你的 notifypropertychanged 中使用 nameof。这样您就不会意外地使用 tye 错误的字符串进行属性更改。就像你现在一样。 “项目”不是您的资源的名称
标签: wpf listview data-binding