Поиск…


замечания

В этом разделе представлен обзор того, что такое mvvm, и почему разработчик может захотеть его использовать.

Следует также упомянуть о любых крупных предметах в mvvm и ссылаться на связанные темы. Поскольку Documentation for mvvm является новым, вам может потребоваться создать начальные версии этих связанных тем.

C # MVVM Резюме и полный пример

Резюме:

MVVM - это архитектурный шаблон, который представлен тремя различными компонентами: Model , View и ViewModel . Чтобы понять эти три уровня, необходимо кратко определить их, а затем объяснить, как они работают вместе.

Модель - это слой, который управляет бизнес-логикой. Он извлекает и сохраняет информацию из любого источника данных для потребления ViewModel .

ViewModel - это слой, который действует как мост между представлением и моделью . Он может или не может преобразовывать необработанные данные из Модели в презентабельную форму для представления . Примерное преобразование: булевский флаг от модели до строки «True» или «False» для представления.

Вид - это слой, который представляет интерфейс программного обеспечения (то есть GUI). Его роль заключается в отображении информации от ViewModel к пользователю, и сообщить изменения информации обратно в ViewModel.

Эти три компонента работают вместе, ссылаясь друг на друга следующим образом:

  • View ссылается на ViewModel .
  • Модель ViewModel ссылается на модель .

Важно отметить, что View и ViewModel способны к двусторонней связи, известной как привязка данных .

Основным компонентом двусторонней связи (привязки данных) является интерфейс INotifyPropertyChanged .

Используя этот механизм, View может изменять данные в ViewModel через пользовательский ввод, а ViewModel может обновлять представление с данными, которые могут быть обновлены с помощью процессов в Модели или с обновленными данными из репозитория.

Архитектура MVVM делает упор на разделении проблем для каждого из этих слоев. Разделение слоев приносит нам пользу:

  • Модульность: внутренняя реализация каждого уровня может быть изменена или заменена, не затрагивая других.
  • Повышенная способность к тестированию: каждый уровень может быть Unit Test с поддельными данными, что невозможно, если код ViewModel написан в Code-Behind of View .

Сборка:

Создайте новый проект приложения WPF Создайте новый проект приложения WPF

Создайте три новые папки в своем решении: Model , ViewModel и View и удалите исходный MainWindow.xaml , чтобы начать новый старт.

Создайте 3 новых папки в своем решении

Создайте три новых элемента, каждый из которых соответствует отдельному слою:

  • Щелкните правой кнопкой мыши папку « Модель » и добавьте элемент класса HelloWorldModel.cs .
  • Щелкните правой кнопкой мыши папку ViewModel и добавьте элемент класса HelloWorldViewModel.cs .
  • Щелкните правой кнопкой мыши папку « Просмотр » и добавьте элемент « Окно» (WPF) под названием HelloWorldView.xaml .

Добавьте три элемента

Alter App.xaml чтобы указать на новый вид

<Application x:Class="MyMVVMProject.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:MyMVVMProject"
             StartupUri="/View/HelloWorldView.xaml">
    <Application.Resources>
         
    </Application.Resources>
</Application>

ViewModel:

Начните сначала с создания ViewModel . Класс должен реализовать интерфейс INotifyPropertyChanged , объявить событие PropertyChangedEventHandler и создать метод для создания события (источник: MSDN: как реализовать уведомление об изменении свойств ). Затем объявите поле и соответствующее свойство, чтобы вызвать метод OnPropertyChanged() в OnPropertyChanged() set свойств. Конструктор в приведенном ниже примере используется для демонстрации того, что Модель предоставляет данные ViewModel .

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

namespace MyMVVMProject.ViewModel
{
    // Implements INotifyPropertyChanged interface to support bindings
    public class HelloWorldViewModel : INotifyPropertyChanged
    {
        private string helloString;

        public event PropertyChangedEventHandler PropertyChanged;

        public string HelloString
        {
            get
            {
                return helloString;
            }
            set
            {
                helloString = value;
                OnPropertyChanged();
            }
        }

        /// <summary>
        /// Raises OnPropertychangedEvent when property changes
        /// </summary>
        /// <param name="name">String representing the property name</param>
        protected void OnPropertyChanged([CallerMemberName] string name = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }

        public HelloWorldViewModel()
        {
            HelloWorldModel helloWorldModel = new HelloWorldModel();
            helloString = helloWorldModel.ImportantInfo;
        }
    }
}

Модель:

Затем создайте модель . Как указано ранее, модель предоставляет данные для ViewModel , вытаскивая их из репозитория (а также отбрасывая обратно в хранилище для сохранения). Это показано ниже с помощью метода GetData() , который возвращает простой List<string> . Бизнес-логика также применяется в этом слое и может быть замечена в методе ConcatenateData() . Этот метод строит предложение «Hello, world!» Из List<string> которое было ранее возвращено из нашего «репозитория».

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

namespace MyMVVMProject.Model
{
    public class HelloWorldModel
    {
        private List<string> repositoryData;
        public string ImportantInfo
        {
            get
            {
                return ConcatenateData(repositoryData);
            }
        }

        public HelloWorldModel()
        {
            repositoryData = GetData();
        }

        /// <summary>
        /// Simulates data retrieval from a repository
        /// </summary>
        /// <returns>List of strings</returns>
        private List<string> GetData()
        {
            repositoryData = new List<string>()
            {
                "Hello",
                "world"
            };
            return repositoryData;
        }

        /// <summary>
        /// Concatenate the information from the list into a fully formed sentence.
        /// </summary>
        /// <returns>A string</returns>
        private string ConcatenateData(List<string> dataList)
        {
            string importantInfo = dataList.ElementAt(0) + ", " + dataList.ElementAt(1) + "!";
            return importantInfo;
        }
    }
}

Посмотреть:

Наконец, View может быть построен. В этом примере ничего не нужно добавлять в код, хотя это может варьироваться в зависимости от потребностей приложения. Однако в XAML добавлено несколько строк. Window нуждается в ссылке на пространство имен ViewModel . Это сопоставляется с пространством имен XAML xmlns:vm="clr-namespace:MyMVVMProject.ViewModel" . Далее, Окно нуждается в DataContext . Для этого установлено значение <vm:HelloWorldViewModel/> . Теперь ярлык (или управление по вашему выбору) можно добавить в окно. Ключевым моментом на этом этапе является обеспечение того, чтобы вы привязывали привязку к свойству ViewModel, которое вы хотите отображать в качестве содержимого метки. В этом случае это {Binding HelloString} .

Важно привязать свойство, а не поле, так как в последнем случае представление не получит уведомление о том, что значение изменилось, поскольку метод OnPropertyChanged() будет только поднять PropertyChangedEvent на свойство, а не на поле.

<Window x:Class="MyMVVMProject.View.HelloWorldView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyMVVMProject.View"
        xmlns:vm="clr-namespace:MyMVVMProject.ViewModel"
        mc:Ignorable="d"
        Title="HelloWorldView" Height="300" Width="300">
    <Window.DataContext>
        <vm:HelloWorldViewModel/>
    </Window.DataContext>
    <Grid>
        <Label x:Name="label" FontSize="30" Content="{Binding HelloString}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</Window>


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow