Avatar billede carsten1973 Nybegynder
06. oktober 2015 - 10:03 Der er 1 løsning

MVVM - datagrid returnerer ikke den opdaterede værdi

Jeg er ny i MVVM og arbejder på et system med et datagrid, hvor man skal kunne redigere rækkerne.

Når jeg opdaterer en række og debugger bliver Update funktionen kaldt men objecte, det får som parameter indeholder stadig "Person" med de oprindelige værdier - ikke de opdaterede.

Jeg bruger RelayCommand til at uddelegere opdateringerne og som trigger bruger jeg CellEditEnding.



Nedenfor er min kode, som er en meget forsimplet version af mit system. Sig endelig til, hvis noget skal uddybes


Model
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;

namespace mvvmproblem.Model
{
    class Person: INotifyPropertyChanged
    {
            string _Name;

        public string Name
        {
            get
            {
                return _Name;
            }
            set
            {
                if(_Name!=value)
                {
                    _Name = value;
                    RaisePropertyChanged("Name");
                }
            }
        }
        int _Age;

        public int Age
        {
            get
            {
                return _Age;
            }
            set
            {
                if(_Age!=value)
                {
                    _Age = value;
                    RaisePropertyChanged("Age");
                }
            }
        }

        void RaisePropertyChanged(string prop)
        {
            if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(prop)); }
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }
    }

ViewModel
       
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Collections.ObjectModel;

using mvvmproblem.Model;

namespace mvvmproblem.ViewModel
{
    class ViewModelMain
    {
        public ObservableCollection<Person> People { get; set; }
        public RelayCommand UpdateCommand { get; set; }
        public ViewModelMain()
        {
            People = new ObservableCollection<Person>
            {
                new Person { Name="John", Age=34 },
                new Person { Name="Harry",Age=26 },
                new Person { Name="Michael",  Age=59 },
            };
            UpdateCommand = new RelayCommand(Update);
        }

        void Update(object obj)
        {
            //here the update should happen, but the values in the object remains those before I updated the datagrid cell
        }



    }
}

View

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ViewModel="clr-namespace:mvvmproblem.ViewModel" x:Class="mvvmproblem.MainWindow"
    xmlns:i ="http://schemas.microsoft.com/expression/2010/interactivity"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid x:Name="myDataGrid" ItemsSource="{Binding People}"    HorizontalAlignment="Left" Margin="124,82,0,0" VerticalAlignment="Top" IsSynchronizedWithCurrentItem="False">
            <DataGrid.DataContext>
                <ViewModel:ViewModelMain/>
            </DataGrid.DataContext>
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="CellEditEnding">
                    <i:InvokeCommandAction Command="{Binding UpdateCommand}" CommandParameter="{Binding ElementName=myDataGrid, Path=SelectedItem}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </DataGrid>

    </Grid>
</Window>

Mainwindow.cs indeholder bare initialize components.
Avatar billede carsten1973 Nybegynder
21. oktober 2015 - 08:17 #1
ovenstående er løst
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester