如果项目字段已更改,则未在列表视图(wpf mvvm)上更新所选项目

时间:2016-09-16 19:51:46

标签: c# wpf listview mvvm mugenmvvmtoolkit

我正在使用wpf和mvvm编写我的第一个程序。 遇到问题,如果在选定项目的字段中更改数据,则无法选择新项目。 如果添加到listview属性SelectionMode =“Single”,那么如果多次尝试选择项目,exeption:

  

已添加具有相同键的元素。

图片:https://www.dropbox.com/s/ey7izl19803uuhc/1.png

如果删除此属性,则选择另一个项目,根本不会发生。 图片:https://dl.dropboxusercontent.com/u/32438899/2.png

如果数据没有改变,导航工作正常。

XAML代码:

<?xml version="1.0" encoding="utf-8" ?>
<Window x:Class="MHConfigurator.Views.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        mc:Ignorable="d" 
        d:DataContext="{Binding Path=MainViewModel}"
        Title="Редактирование шаблонов писем" Height="Auto" Width="1000" MinWidth="1000" MinHeight="400">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>

        <DockPanel Grid.Row="0" Margin="7">
            <TextBlock DockPanel.Dock="Left" Margin="5,5,2,5" HorizontalAlignment="Left">Поиск:</TextBlock>
            <TextBox DockPanel.Dock="Right"  Margin="2,2,2,2" HorizontalAlignment="Stretch" Text="{Binding SearchString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
        </DockPanel>



        <ListView Grid.Row="1" ItemsSource="{Binding Path=MailProperties, Mode=TwoWay}" Width="Auto" HorizontalAlignment="Stretch" 
                  VerticalAlignment="Stretch" Margin="5" SelectedItem="{Binding Path=CurrentProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding ButtonID, Mode=TwoWay}" Header="ID шаблона" Width="Auto" />
                    <GridViewColumn DisplayMemberBinding="{Binding Description, Mode=TwoWay}" Header="Описание" Width="Auto" />
                </GridView>
            </ListView.View>
        </ListView>


        <Grid  VerticalAlignment="Center"  Grid.Row="2"  DataContext="{Binding CurrentProperty}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="250"></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
            </Grid.RowDefinitions>

            <DockPanel Grid.Row="0" Grid.Column="0">
                <TextBlock DockPanel.Dock="Left" Margin="5,5,2,5"  VerticalAlignment="Center" HorizontalAlignment="Left">ID шаблона:</TextBlock>
                <TextBox DockPanel.Dock="Right"  Margin="2,2,2,2"  VerticalAlignment="Center" HorizontalAlignment="Stretch" 
                         VerticalContentAlignment="Center" Text="{Binding ButtonID}"></TextBox>
            </DockPanel>


            <DockPanel Grid.Row="1" Grid.Column="0">
                <CheckBox DockPanel.Dock="Left" HorizontalAlignment="Left" Margin="5" VerticalAlignment="Center" IsChecked="{Binding FillSubject}">Заполнять тему</CheckBox>
            </DockPanel>

            <DockPanel Grid.Row="2" Grid.Column="0">
                <CheckBox DockPanel.Dock="Left" HorizontalAlignment="Left" Margin="5" VerticalAlignment="Center" IsChecked="{Binding FillTO}">Заполнять адресатов</CheckBox>
            </DockPanel>

            <DockPanel Grid.Row="3" Grid.Column="0">
                <CheckBox DockPanel.Dock="Left" HorizontalAlignment="Left" Margin="5" VerticalAlignment="Center" IsChecked="{Binding FillCopy}">Заполнять копию</CheckBox>
            </DockPanel>

            <DockPanel Grid.Row="4" Grid.Column="0">
                <CheckBox DockPanel.Dock="Left" HorizontalAlignment="Left" Margin="5" VerticalAlignment="Center" IsChecked="{Binding FillHideCopy}">Заполнять скрытую копию</CheckBox>
            </DockPanel>

            <DockPanel Grid.Row="5" Grid.Column="0">
                <CheckBox DockPanel.Dock="Left" HorizontalAlignment="Left" Margin="5" VerticalAlignment="Center" IsChecked="{Binding HighImportance}">Высокая важность</CheckBox>
            </DockPanel>





            <DockPanel Grid.Row="0" Grid.Column="1">
                <TextBlock DockPanel.Dock="Left" VerticalAlignment="Center" Margin="10,5,2,5" Width="115" >Описание шаблона:</TextBlock>
                <TextBox DockPanel.Dock="Left" Margin="2,2,5,2" TextWrapping="Wrap" VerticalContentAlignment="Center" Text="{Binding Description}"></TextBox>
            </DockPanel>


            <DockPanel Grid.Row="1" Grid.Column="1">
                <TextBlock DockPanel.Dock="Left" VerticalAlignment="Center" Margin="10,5,2,5" Width="115">Тема письма:</TextBlock>
                <TextBox DockPanel.Dock="Left" Margin="2,2,5,2" TextWrapping="Wrap" VerticalContentAlignment="Center" Text="{Binding Subject}"></TextBox>
            </DockPanel>

            <DockPanel Grid.Row="2" Grid.Column="1">
                <TextBlock DockPanel.Dock="Left" VerticalAlignment="Center" Margin="10,5,2,5" Width="115">Адресаты:</TextBlock>
                <TextBox DockPanel.Dock="Left" Margin="2,2,5,2" TextWrapping="Wrap" VerticalContentAlignment="Center" Text="{Binding TO}"></TextBox>
            </DockPanel>

            <DockPanel Grid.Row="3" Grid.Column="1">
                <TextBlock DockPanel.Dock="Left" VerticalAlignment="Center" Margin="10,5,2,5" Width="115">Копия:</TextBlock>
                <TextBox DockPanel.Dock="Left" Margin="2,2,5,2" TextWrapping="Wrap" VerticalContentAlignment="Center" Text="{Binding Copy}"></TextBox>
            </DockPanel>

            <DockPanel Grid.Row="4" Grid.Column="1">
                <TextBlock DockPanel.Dock="Left" VerticalAlignment="Center" Margin="10,5,2,5" Width="115">Скрытая копия:</TextBlock>
                <TextBox DockPanel.Dock="Left" Margin="2,2,5,2" TextWrapping="Wrap" VerticalContentAlignment="Center" Text="{Binding HideCopy}"></TextBox>
            </DockPanel>

            <DockPanel Grid.Row="5" Grid.Column="1">

                <CheckBox DockPanel.Dock="Left" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="5">Напоминание</CheckBox>
                <TextBlock DockPanel.Dock="Left" VerticalAlignment="Center" Margin="4">Время напоминания:</TextBlock>
                <TextBox DockPanel.Dock="Left" Margin="2,2,5,2" VerticalContentAlignment="Center"></TextBox>
            </DockPanel>

            <DockPanel Grid.Row="6" Grid.Column="1">
                <CheckBox DockPanel.Dock="Left" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5">Заполнять текст письма</CheckBox>

            </DockPanel>


            <DockPanel Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="2">
                <Button DockPanel.Dock="Left" Margin="15" HorizontalAlignment="Left" VerticalAlignment="Center" Width="150" Height="40">Добавить новый шаблон</Button>
                <Button DockPanel.Dock="Left" Margin="15" HorizontalAlignment="Left" VerticalAlignment="Center" Width="150" Height="40">Сохранить</Button>
                <Button DockPanel.Dock="Left" Margin="15" HorizontalAlignment="Left" VerticalAlignment="Center" Width="150" Height="40">Отмена</Button>

                <TextBlock DockPanel.Dock="Left" Margin="0,4,4,4" VerticalAlignment="Center">Заметка:</TextBlock>
                <TextBox DockPanel.Dock="Right" Margin="5" TextWrapping="Wrap" AcceptsReturn="True" Height="70"  HorizontalAlignment="Stretch" VerticalScrollBarVisibility="Visible"
                         SpellCheck.IsEnabled="True" Language="ru-ru"></TextBox>
            </DockPanel>
        </Grid>
    </Grid>
</Window>

在viewmodel中问题不可能。这很容易,PropertyChanged会在必要时调用。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MugenMvvmToolkit;
using MugenMvvmToolkit.ViewModels;
using MugenMvvmToolkit.Models;
using System.Windows.Input;
using MHConfigurator.Models;
using System.Windows;

namespace MHConfigurator.ViewModels
{
    class MainViewModel : ViewModelBase
    {

        public MainViewModel()
        {
            _mailProperties = new ObservableCollection<MailProperty>(DAL.GetDAL().MailPropertys);

            //MailsTemplates = DAL.GetDAL().GetEmptyMailTemplates();
        }


        #region Fields

        #region Backing Fields

        private ObservableCollection<MailProperty> _mailProperties;
        private MailProperty _currentProperty;
        private string _searchString;

        private MailProperty _originalCurrentProperty;
        private bool _currentPropertyChanged = false;

        private List<MailsTemplate> _mailsTemplates;
        private int _selectedMailTemplate;

        #endregion
        public string SearchString
        {
            get
            {
                if (_searchString.IsNullOrEmpty()) return "";
                return _searchString;
            }
            set
            {
                bool stringContains = _searchString != null && value.Contains(_searchString);
                _searchString = value;
                CurrentProperty = null;


                //Not matter     

            }
        }

        public ObservableCollection<MailProperty> MailProperties
        {
            get { return _mailProperties; }
            set
            {
                _mailProperties = value;
                //OnPropertyChanged(new PropertyChangedEventArgs("MailProperties"));
                OnPropertyChanged();
            }
        }

        public MailProperty CurrentProperty
        {
            get { return _currentProperty; }
            set
            {/*
                if ((_originalCurrentProperty != null)&&(_currentPropertyChanged)&&(_originalCurrentProperty!=_currentProperty)) //Если выбран другой объект и есть несохранённые изменения
                {
                    MessageBoxResult result = MessageBox.Show("Есть несохранённые изменения. Сохранить?", "Несохранённые изменения", MessageBoxButton.YesNo, MessageBoxImage.Question);
                    if (result == MessageBoxResult.Yes)
                    {

                    }
                    else
                    {
                        MailProperties[MailProperties.IndexOf(_currentProperty)] = _originalCurrentProperty; //Находим в коллекции изменённый объект и заменить его оригиналом
                    }
                }

                _originalCurrentProperty = Helper.DeepClone(_currentProperty); //Делаем резервную копию
                SelectedMailTemplate = value.BodyID; //выставляем id шаблона
                */
                _currentProperty = value;

               // OnPropertyChanged(new PropertyChangedEventArgs("CurrentProperty"));
                OnPropertyChanged();
            }
        }





        public List<MailsTemplate> MailsTemplates
        {
            get { return _mailsTemplates; }
            set
            {
                _mailsTemplates = value; 
                OnPropertyChanged();
            }
        }
        public int SelectedMailTemplate
        {
            get { return _selectedMailTemplate; }
            set
            {
                _selectedMailTemplate = value;
                CurrentProperty.BodyID = value;
                OnPropertyChanged();
            }
        }

        #endregion

        #region Commands

        public ICommand NewCommand { get; private set; }
        public ICommand SaveCommand { get; private set; }
        public ICommand CancelCommand { get; private set; }

        #region Execute



        #endregion

        #region CanExecute



        #endregion

        #endregion
}}

我不知道。 我会很高兴任何想法。

P.S。:抱歉我的英语不好。

0 个答案:

没有答案