【发布时间】:2017-01-20 00:55:24
【问题描述】:
我有一个ObservableCollection<UsageItem> MyItems;:
编辑:
public class UsageItem : INotifyPropertyChanged
{
string _Name;
public string Name
{
get
{
return _Name;
}
set
{
if (_Name != value)
{
_Name = value;
RaisePropertyChanged("Name");
}
}
}
int _ChargesLeft;
public int ChargesLeft
{
get
{
return _ChargesLeft;
}
protected set
{
if (_ChargesLeft != value)
{
_ChargesLeft = value;
RaisePropertyChanged("ChargesLeft");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string prop)
{
if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(prop)); }
}
public Consummable(string name, int charges)
{
this.Name = name;
this.ChargesLeft = charges;
}
public override string DisplayName
{
get
{
if (ChargesLeft > 1)
{
return Name + " " + ChargesLeft + "charges";
}
else
{
return Name + " " + ChargesLeft + "charge";
}
}
}
public override void use(Hero hero)
{
if(this.ChargesLeft >= 1)
{
this.ChargesLeft--;
}else{
//Will remove this UsageItem from my ObservableCollection
...
}
}
}
我已将Collection 绑定到ListBox:
<ListBox x:Name="listBoxBackPack" ItemsSource="{Binding MyItems}" SelectedItem="{Binding SelectedItem}" DisplayMemberPath="DisplayName"/>
我有一个按钮,当单击它时调用我的SelectedItem 上的use 函数,它将减少我的 ChargesLeft 字段的值或删除对象。
如果我在 ChargesLeft 值
但是,如果我使用 ChargesLeft >= 1 的项目,那么我会减少我的字段,因此会更改我的 DisplayName。
由于我仍在更改我的收藏,我希望触发 CollectionChanged 事件并且刷新我的 ListBox 并显示该项目的新 DisplayValue,但它没有发生,ListBox 继续显示旧的 DisplayValue .
此时如果我手动执行Listbox.Items.Refresh()(将其绑定在按钮上进行测试)它将刷新并正确显示正确的DisplayValue,但我无法从我的ViewModel 调用此函数,因为它没有了解我的ListBox
如何在我修改项目时自动强制刷新我的ListBox?
【问题讨论】:
-
在
UsageItem(msdn.microsoft.com/library/ms743695(v=vs.110).aspx) 中实现INotifyPropertyChanged
标签: c# wpf mvvm data-binding observablecollection