编辑WPF列表视图项并提交更改

时间:2015-10-08 12:27:24

标签: c# wpf listview

已更新

代码链接:Dropbox files

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

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

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

主要对话:

enter image description here

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

编辑对话框:

enter image description here

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

0 个答案:

没有答案