【问题标题】:Edit WPF listview item and commit changes编辑 WPF 列表视图项并提交更改
【发布时间】:2015-10-08 12:27:23
【问题描述】:

更新

代码链接:Dropbox files

我有一个 WPF 列表视图,其中填充了通过 itemsSource 绑定的数据。绑定的项目是一个名为 User 的类对象,其中包含一些属性,例如 Name、Age、Mail 和 Info。

我想要做的是能够双击任何列表视图项目并弹出一个编辑对话框,这将允许我更改该个人的邮件和信息。然而,这些更改只会在我点击 OK 时提交,否则它们会被忽略。

我遇到的问题或地方是,如何使用所选列表视图项的信息/邮件填充编辑对话框? 我如何将这些更改提交回项目并更新主列表视图?其余关于弹出对话框和诸如此类的代码都已经实现了。

主对话框:

XAML - 主对话框

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="240" Width="350"
        WindowStartupLocation="CenterScreen">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <ListView Name="lvDataBinding" Grid.Row="0" Background="LightBlue">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <WrapPanel>
                        <TextBlock Text="Name: " />
                        <TextBlock Text="{Binding Name}" FontWeight="Bold" />
                        <TextBlock Text=", " />
                        <TextBlock Text="Age: " />
                        <TextBlock Text="{Binding Age}" FontWeight="Bold" />
                        <TextBlock Text=" (" />
                        <TextBlock Text="{Binding Mail}" TextDecorations="Underline" Foreground="Blue" Cursor="Hand" />
                        <TextBlock Text=")" />
                    </WrapPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <EventSetter Event="MouseDoubleClick" Handler="listViewItem_MouseDoubleClick" />
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>
        <StackPanel Grid.Row="1" Orientation="Horizontal">
            <Label Content="Selected:" HorizontalAlignment="Left"/>
            <Label Content="{Binding SelectedItem.Info, ElementName=lvDataBinding}" HorizontalAlignment="Left" Width="140"/>
            <!--<Label Content="{Binding ElementName=lvDataBinding, Path=SelectedItem.Name}" HorizontalAlignment="Left" Margin="72,172,0,0" Width="140"/>-->
        </StackPanel>
    </Grid>
</Window>

CS - 主对话框

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<User> items = new List<User>();
            items.Add(new User() { Name = "John Doe", Age = 42, Mail = "john@doe-family.com", Info = "A basketball player"});
            items.Add(new User() { Name = "Jane Doe", Age = 39, Mail = "jane@doe-family.com", Info = "A soccer player" });
            items.Add(new User() { Name = "Sammy Doe", Age = 13, Mail = "sammy.doe@gmail.com", Info = "A hockey player" });
            lvDataBinding.ItemsSource = items;
        }

        private void listViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            ListViewItem item = sender as ListViewItem;
            object obj = item.Content;
            //User user = sender as User;
            Console.WriteLine(item);

            // popup window
            Window editDialog = new EditWindow();
            editDialog.Owner = this;
            editDialog.ShowDialog();

            if (editDialog.DialogResult.HasValue && editDialog.DialogResult.Value)
            {
                Console.WriteLine("User pressed OK");
                ;
            }
            else
            {
                Console.WriteLine("User pressed Cancel");
            }

        }
    }

    public class User
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Mail { get; set; }
        public string Info { get; set; }
    }
}

编辑对话框:

XAML - 编辑对话框

<Window x:Class="WpfApplication1.EditWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="EditWindow" Height="140" Width="200"
        WindowStartupLocation="CenterScreen">
    <Grid Margin="10">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <Label Content="Email: " Grid.Row="0" Grid.Column="0"/>
        <TextBox Background="AliceBlue" Grid.Row="0" Grid.Column="1" AcceptsReturn="True" TextWrapping="Wrap" DockPanel.Dock="Right"/>
        <Label Content="Info: " Grid.Row="1" Grid.Column="0"/>
        <TextBox Background="AliceBlue" Grid.Row="1" Grid.Column="1" AcceptsReturn="True" TextWrapping="Wrap" DockPanel.Dock="Right"/>
        <StackPanel Grid.Row="2" Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Bottom">
            <Button Content="Cancel" MinWidth="50" Height="25" Click="ButtonCancelClick"/>
            <Button Content="OK" MinWidth="50" Height="25" Click="ButtonOkClick"/>
        </StackPanel>
    </Grid>
</Window>

CS - 编辑对话框

using System.Windows;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for EditWindow.xaml
    /// </summary>
    public partial class EditWindow : Window
    {
        public EditWindow()
        {
            InitializeComponent();
        }

        private void ButtonOkClick(object sender, RoutedEventArgs e)
        {
            DialogResult = true;
            this.Close();
        }

        private void ButtonCancelClick(object sender, RoutedEventArgs e)
        {
            DialogResult = false;
            this.Close();
        }
    }
}

【问题讨论】:

    标签: c# wpf listview


    【解决方案1】:

    为了让它发挥作用,有很多事情需要改变。

    1. 在您的 User 类上实现 INotifyPropertyChanged

    没有它,你不能在 wPF 中进行两种方式的绑定。只需谷歌并阅读,直到您了解它是如何工作的。

    1. 在您的 EditWindow 上创建一个公共 CurrentItem 属性

    2. (listViewItem_MouseDoubleClick 事件)

      • 创建用户类的新实例 (myUser) 并从 item.Content 复制所有属性值(您首先需要将其类型转换为用户对象)

      • 设置editDialog.CurrentItem = myUser的新CurrentItem

      • 如果用户按下 ok,则将 editDialog.CurrentItem 的所有属性复制回 item.Content 对象(记住这应该已经被类型转换为用户)

    3. 在 EditWindow 上创建所有指向 CurrentItem 对象的 Bindins。

    希望对您有所帮助。

    【讨论】:

    • 感谢您的指导。我能够实现第 1 步和第 2 步。我不确定如何进行第三步。请问你能帮帮我吗?我在上面的代码中发布了 Dropbox 链接。
    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多