Moin,
ich habe ein kleines Problem mit meiner GUI. Meine WPF Anwendung besteht aus einer Listview, 2 TextBoxen und einem Button. Die Idee ist folgende:
Ich klicke auf einen Eintrag in der Listview, die beiden TextBoxen kriegen die entsprechenden Werte, ich ändere einen oder beide Werte, klicke auf den Button, werfe die Änderungen in die Datenbank und falls das klappt will ich die GUI aktualisieren. Irgendwie klappt das aber nicht so ganz 🤔
Listview:
<ListView Name="Employees_Listview" ItemsSource="{Binding Employees, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding YourSelectedItem, Mode=TwoWay}" Height="86">
<ListView.View>
<GridView>
<GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding FirstName}"/>
<GridViewColumn Header="LastName" DisplayMemberBinding="{Binding LastName}"/>
</GridView>
</ListView.View>
</ListView>
beide TextBoxen (diese sind absichtlich nicht direkt an das SelectedItem "YourSelectedItem" gekoppelt da ich ansonsten im ViewModel den aktualisierten Text nicht auslesen konnte -- habs net hingekriegt)
<TextBox Name="FirstNameTextBox" Width="136" Text="{Binding FirstName, Mode=TwoWay}" />
<TextBox Name="LastNameTextBox" Width="136" Text="{Binding LastName, Mode=TwoWay}" />
mein UpdateCommand
private void UpdateEmployee()
{
var container = ContainerConfig.Configure();
using (var scope = container.BeginLifetimeScope())
{
var SelectedEmployee = scope.Resolve<IEmployeeRepository>();
YourSelectedItem.FirstName = FirstName;
YourSelectedItem.LastName = LastName;
if (!SelectedEmployee.Update(YourSelectedItem))
{
MessageBox.Show("Datensatz konnte nicht aktualisiert werden!" + "\n" + "Bitte den Administrator verständigen!");
return;
};
}
}
und meine 3 Properties
//TEST
private string lastname;
public string LastName
{
get { return lastname; }
set
{
lastname = value;
NotifyPropertyChanged("LastName");
}
}
private string firstname;
public string FirstName
{
get { return firstname; }
set
{
firstname = value;
NotifyPropertyChanged("FirstName");
}
}
//TEST
public EmployeeEntity YourSelectedItem
{
get
{
return _yourSelectedItem;
}
set
{
if (value != null) {
FirstName = value.FirstName;
LastName = value.LastName;
}
_yourSelectedItem = value;
NotifyPropertyChanged("YourSelectedItem");
}
}
Sodele, wenn ich nun einen Eintrag anklicke, ändern sich die TextBoxen, ich kann etwas verändern, den Button drücken und die SQLite Datei wird aktualisiert. Wenn ich dann in der ListView andere Einträge anklicke und wieder zu meinem ursprünglichen zurück komme sehe ich in der TextBox den aktualisierten Wert, aber die ListView ist noch unverändert.
Hab rausgefunden das meine ObservableCollection so nur auf "Add" oder "Remove" reagiert, nicht aber wenn ich die Properties eines Items ändere.
Was kann ich hier tun?
PS: Ich habe diesen Ansatz bewusst gewählt da ich ja bei verknüpften (zum ausgewählten Element)TextBoxen das Problem hätte bei einem Fail zur Datenbank, die "alten" Werte wieder holen zu müssen (und keine Datenbank = keine alten Werte). Muss natürlich es nicht zwingen diese Lösung sein, aber es war für mich die "sinnvollste" Variante
… habe vergessen der Klasse das "INotifyPropertyChanged" mitzugeben, aber das Event hatte ich bereits drin
Ist nicht mein Tag heute, danke dir für den Wink mit dem Zaunpfahl 👍