Laden...

ListView-Eintrag (ObservableCollection) in Fenster editieren

Erstellt von codekid vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.403 Views
C
codekid Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren
ListView-Eintrag (ObservableCollection) in Fenster editieren

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();
        }
    }
}

16.842 Beiträge seit 2008
vor 5 Jahren

Du solltest in WPF mit MVVM arbeiten; das ist schon technologisch so vorgesehen.
[Artikel] MVVM und DataBinding

C
codekid Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren

Danke für deine Antwort.

Verstehe ich den Artikel richtig, dass ich INotifyPropertyChanged implementieren muss, muss das von mir Beschriebene zu erreichen?

4.942 Beiträge seit 2008
vor 5 Jahren

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!

C
codekid Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren

Ich werde die Links studieren, doch was wäre die einfachste (wenn auch nicht beste) Lösung, die Editierbarkeit des Listen-Eintrags zu erreichen?

16.842 Beiträge seit 2008
vor 5 Jahren

Mit MVVM und Datenbindung. Oder was ist die konkrete Frage?