Ich habe ein ObservableCollection<UsageItem> MyItems;
:beobachtbare Sammlung Ausgabe in List-Box mit DisplayMemberPath
EDIT:
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
...
}
}
}
Ich habe meine Collection
an ein ListBox
gebunden:
<ListBox x:Name="listBoxBackPack" ItemsSource="{Binding MyItems}" SelectedItem="{Binding SelectedItem}" DisplayMemberPath="DisplayName"/>
Ich habe ein Knopf, dass, wenn geklickt wird, rufen Sie die use
Funktion auf meinem SelectedItem
, es Verringert den Wert meines ChargesLeft-Felds oder entfernt das Objekt.
Wenn ich auf die Schaltfläche klicke, während mein ChargesLeft-Wert < = 1 ist, wird mein Artikel aus meiner Sammlung entfernt und meine ListBox wird wie erwartet aktualisiert, kein Problem.
Aber wenn ich ein Element mit einem ChargesLeft> = 1 verwende, dann werde ich mein Feld verkleinern und so in der Folge meinen DisplayName ändern.
Als ich noch meine Sammlung ändere, würde ich erwarten, ein CollectionChanged
Event zu feuern und meine ListBox zu aktualisieren und die neue DisplayValue
des Artikels anzuzeigen, aber es passiert nicht, die ListBox
weiterhin die alte DisplayValue
anzeigen.
In diesem Moment, wenn ich manuell eine Listbox.Items.Refresh()
(Binded es auf einer Schaltfläche zum Testen) wird es aktualisiert und korrekt angezeigt, das Recht DisplayValue
, aber ich kann diese Funktion nicht von meinem ViewModel
aufrufen, da es keine Kenntnis von meinem ListBox
hat
Wie kann ich die Aktualisierung meiner ListBox
automatisch erzwingen, wenn ich ein Element ändere?
implementieren 'INotifyPropertyChanged' in' UsageItem' (https://msdn.microsoft.com/library/ms743695(v=vs.110).aspx) – ASh