Avatar billede tripwire Nybegynder
26. maj 2013 - 21:30 Der er 2 kommentarer og
1 løsning

WPF og MVVM begynder spørgsmål

Hej Eksperter

Jeg er begyndt at kigge på WPF og MVVM og har lavet et lille eksempel bare for at rode lidt med det hele, men er løbet ind i et spørgsmål.


Det er nok nemmest hvis jeg lige viser koden

xaml:
<Window x:Class="DataGridUpdateTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid x:Name="MyDataGrid" HorizontalAlignment="Left" Margin="89,84,0,0" VerticalAlignment="Top" AutoGenerateColumns="True"/>

    </Grid>
</Window>

MVVM
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.Navigation;
using System.Windows.Shapes;
using System.Timers;

namespace DataGridUpdateTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            myViewModel vm = new myViewModel();
            MyDataGrid.ItemsSource = vm.getList();
        }
    }

    class myViewModel
    {
        System.Collections.ObjectModel.ObservableCollection<Car> CarListe;

        public myViewModel()
        {
            CarListe = new System.Collections.ObjectModel.ObservableCollection<Car>();
            myModel m = new myModel();
            CarListe = m.getList();
        }

        public System.Collections.ObjectModel.ObservableCollection<Car> getList()
        {
            return CarListe;
        }

    }

    class myModel
    {
        System.Collections.ObjectModel.ObservableCollection<Car> privateCarListe;

        public myModel()
        {
            privateCarListe = new System.Collections.ObjectModel.ObservableCollection<Car>();
            privateCarListe.Add(new Car("Mazda",4));
            privateCarListe.Add(new Car("Mercedes",2));
            privateCarListe.Add(new Car("Toyata",1));

        }

        public System.Collections.ObjectModel.ObservableCollection<Car> getList()
        {
            return privateCarListe;
        }

    }

    class Car
    {
        System.Timers.Timer timer;
        Random rnd;
        public string Maker { get; set; }
        public int NumberOfWheels { get; set; }

        public Car(string m, int n)
        {
            Maker = m;
            NumberOfWheels = n;

            rnd = new Random();
            timer = new System.Timers.Timer();
            timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            timer.Interval = (1000);
            timer.Enabled = true;
            timer.Start();
        }

        private void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            NumberOfWheels = rnd.Next(1, 5);     
        }

    }

}

Basalt set handler det om at hvert sekund affyres en timer som ændrer NumberOfWheels..

Hvorfor kan jeg ikke se denne ændring i mit datagrid?

Hvis jeg trykker for at sortere på datagridden, så kan jeg se at den ændrer sig som den skal hvert sekund, men hvorfor "refresher" mit datagrid ikke automatisk, når timeren affyres og den har ændret NumberOfWheels?

Jeg har prøver at lave ovenstående eksempel efter de korrekt MVVM principper, så hvis jeg har misforstået noget, så må I gerne lige sige det :) takker..
Avatar billede platik Nybegynder
27. maj 2013 - 10:08 #1
Din Car klasse mangler en måde at give besked til UI om en property har ændret sig.

Se evt. (INotifyPropertyChanged)

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

Hvad angår MVVM så der plads til forbedringer.
Når du får løst dit første problem vil jeg anbefale dig at kigge lidt på Binding. I den forbindelse får du også brug for at ændre dine getList metoder og lave dem om til properties. Det andet liger også java kode :-)

Hvis du gerne vil lære lidt mere generelt om MVVM kan jeg anbefale denne artikkel:

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

Den indeholder en demo der viser en måde at gære de mest gængse ting på.

Sig endelig til hvis du har yderligere spørgsmål.
Avatar billede tripwire Nybegynder
30. maj 2013 - 21:14 #2
Mange tak.. smid et svar :)
Avatar billede platik Nybegynder
30. maj 2013 - 21:21 #3
Svar :)
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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