Hallo,
folgende Einsteiger-Frage:
Ich habe eine Liste von Objekten, die in einer ListView-Box eingezeigt werden. Bei Doppelclick auf ein Item soll sich ein neues Fenster öffnen, in dem das Name-Property des Objekts editiert werden kann. Wie setzte ich dies (geschickt) um?
Danke schon einmal - hier mein Versuch:
<Window x:Class="EditableList.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:EditableList"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<DockPanel>
<ListView Name="personList" MouseDoubleClick="personList_MouseDoubleClick">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
</GridView>
</ListView.View>
</ListView>
</DockPanel>
</Window>
namespace EditableList
{
public partial class MainWindow : Window
{
private ObservableCollection<Person> items = new ObservableCollection<Person>();
public MainWindow()
{
InitializeComponent();
items.Add(new Person() { Name = "Person 1" });
items.Add(new Person() { Name = "Person 2" });
items.Add(new Person() { Name = "Person 3" });
personList.ItemsSource = items;
}
private void personList_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
Person user = ((FrameworkElement)e.OriginalSource).DataContext as Person;
if(user != null) {
EditWin win = new EditWin(user);
win.ShowDialog();
}
}
}
public class Person
{
public string Name { get; set; }
}
}
<Window x:Class="EditableList.EditWin"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:EditableList"
mc:Ignorable="d"
Title="EditWin" Height="144.304" Width="443.217">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="716*"/>
<ColumnDefinition Width="43*"/>
<ColumnDefinition Width="33*"/>
</Grid.ColumnDefinitions>
<TextBox Name="txtName" HorizontalAlignment="Left" Height="22" Margin="88,37,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="269" Text="{Binding Name, Mode=OneWay}"/>
<Label Content="Name" HorizontalAlignment="Left" Margin="41,37,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1.668,-3.375"/>
<Button Content="Save name" HorizontalAlignment="Left" Margin="88,73,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace EditableList
{
public partial class EditWin : Window
{
private Person currentPerson;
public EditWin(Person _user)
{
InitializeComponent();
currentPerson = _user;
this.txtName.Text = currentPerson.Name;
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
currentPerson.Name = txtName.Text;
this.Close();
}
}
}
Du solltest in WPF mit MVVM arbeiten; das ist schon technologisch so vorgesehen.
[Artikel] MVVM und DataBinding
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Danke für deine Antwort.
Verstehe ich den Artikel richtig, dass ich INotifyPropertyChanged implementieren muss, muss das von mir Beschriebene zu erreichen?
Ja genau, verwende einfach die im Artikel gezeigte Klasse BaseViewModel
und benutze diese dann in den ViewModel-Klassen.
Etwas schwieriger wird es jedoch aus einem ViewModel heraus einen Dialog anzuzeigen.
Hier mal zwei englische Artikel dazu:
Dialogs In WPF (MVVM)
Showing Dialogs When Using the MVVM Pattern in WPF or UWP
Dies wird dich jetzt wahrscheinlich als Einsteiger etwas überfordern, aber man muß sich ja Ziele setzen und etwas lernen. 😉
Du könntest aber mit Das große Geheimnis um MVVM und Dialogs einsteigen und schauen, ob du es damit ersteinmal zum Laufen kriegst. Viel Erfolg!
Ich werde die Links studieren, doch was wäre die einfachste (wenn auch nicht beste) Lösung, die Editierbarkeit des Listen-Eintrags zu erreichen?
Mit MVVM und Datenbindung. Oder was ist die konkrete Frage?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code