Entwickler-Ecke
WPF / Silverlight - SelectedItem not being updated
doubleII - Mo 11.02.19 21:26
Titel: SelectedItem not being updated
Hallo, kann mir jemand sagen wie könnte man eine Zeile aus der DataGrid aktualisieren?
xaml
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| <Grid> <DataGrid Name="Grid" ItemsSource="{Binding Path=Item, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" SelectedItem="{Binding Path=SelectedRow, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" IsReadOnly="True" CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="True" AutoGeneratingColumn="Grid_OnAutoGeneratingColumn"> <DataGrid.ContextMenu> <ContextMenu> <MenuItem Header="Update" Command="{Binding Path=BtnUpdate}"/> </ContextMenu> </DataGrid.ContextMenu> </DataGrid> </Grid> |
ViewModel
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| public RelayCommand BtnUpdate { get; set; }
public ObservableCollection<User> Item { get { return _user; } set { _user = value; OnPropertyChanged(nameof(Item)); } }
public User SelectedRow { get { return _selectedRow;} set { _selectedRow = value; OnPropertyChanged(nameof(SelectedRow)); } }
public void AddColumn() { BtnUpdate = new RelayCommand(Select); Item.Add(new User() { Name = "Jane", Age=26, Mail = "hello@gmail.com"}); }
private void Select(object obj) { if (SelectedRow is null) return; } |
Das Problem ist, ich aktualisiere nicht direct SelectedRow proprerty, sondern die User class Properties (Name, Age, Mail) und die OnPropertyChanged Methode wird nicht aufgerufen.
OnPropertyChanged wird aufgerufen, sobald ich auf die DataGrid klicke.
Danke!
Christian S. - Mo 11.02.19 23:18
Wenn ich dich richtig verstanden habe, muss auch die User-Klasse das INotifyPropertyChanged-Interface implementieren, sodass über Änderungen an den Eigenschaften benachrichtigt wird.
doubleII - Di 12.02.19 09:26
Hallo Christien,
das wollte ich eben vermeiden. Eine Model-Klasse implementiert INotifyPropertyChanded-Interface.
Ich selber komme ich auch nicht auf andere Lösung des Problems. Ist es gute Praxis, wenn eine Model-Klasse diesen Interface implementiert?
Gruß
Th69 - Di 12.02.19 10:22
Was passiert denn, wenn du in der Methode dann auch OnPropertyChanged(nameof(SelectedRow)) aufrufst?
PS: Die Eigenschaft Item solltest du im Plural (also Items) benennen.
doubleII - Di 12.02.19 13:04
Zitat: |
Was passiert denn, wenn du in der Methode dann auch OnPropertyChanged(nameof(SelectedRow)) aufrufst? |
ich habe getestet, passiert nichts.
Zitat: |
PS: Die Eigenschaft Item solltest du im Plural (also Items) benennen. |
danke ;)
Zitat: |
eventuell hilft dir nachfolgendes Nuget Package.
Die Library ist Open Source. |
Danke, ich versuche zu verstehen, wie man so ein Problem zu fuss lösen kann. Wahrscheinlich auf andere Weise schafft man nicht.
- Entweder ein nuget packet kommt in Frage oder das Model-Klass implementiert INotifyPropertyChanged
P.P. mein Model-Klass implementiert jetzt INotifyPropertyChanged. Sauber oder nicht, lasse ich es so. :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!