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;
           //TODO edit Name to Tom for example _selectedRow
        }


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.


Chiyoko - Di 12.02.19 12:00

Hallo,

eventuell hilft dir nachfolgendes Nuget Package.
Die Library ist Open Source.

Obsolate INotifyPropertyChanged [https://www.codemag.com/article/0907101/INotifyPropertyChanged-Is-Obsolete]
Nuget Upate Controls [https://archive.codeplex.com/?p=updatecontrols]


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. :)