Как сделать привязку к классу

272
31 мая 2017, 02:30

Помогите сделать привязку данных к свойствам класса. 2 день не могу разобраться. Вроде теорию понимаю а код получается с кучей ошибок. Для теста создал новый проект wpf в нем папки - pages и - mv для страниц wpf и вью моделей. Нужно загнать в Label Content="{}" текст = Text из класса MainVM Вот разметка xaml страницы page1 :

<Page x:Class="wpf_test.Pages.Page1"
  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:DesignHeight="300" d:DesignWidth="300" 
  Title="Page1" Background="Aqua">
<Grid>
    <Label />
</Grid>

и сам класс MainVM

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace wpf_test.mv
{
public class MainVM 
{
   public string Text { get; set; }
   MainVM() { Text = "String test"; }
 }
}

Теперь как я понимаю нужно сделать привязку данных что то вроде

 <Page.DataContext>
    <....>
  </Page.DataContext>

Что писать вместо точек и как закончить привязку? Правильно ли вообще я действую и правильно ли использую паттерн MVVM?

Answer 1

Ну почти.

Для начала, вам нужно

<Label Content="{Binding Text}"/>

чтобы привязка проходила к полю Test.

Затем, вам нужно, чтобы в DataContext вашей страницы попал экземпляр MainVM.

Это можно сделать разными путями. Например, так, как вы написали, в XAML:

<Page.DataContext>
    <vm:MainVM/>
</Page.DataContext>

Чтобы железяка понимала, что означает vm, вам нужно определить xmlns:vm как-то так:

<Page x:Class="wpf_test.Pages.Page1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:vm="clr-namespace:wpf_test.mv"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

Другой способ — установить в code-behind:

public Page()
{
    InitializeComponent();
    DataContext = new mv.MainVM();
}

Способ, которым я обычно пользуюсь — не присваивать DataContext самостоятельно, а присвоить его в том коде, который показывает страницу (но это может быть невозможно для навигационных команд, я не проверял).

Ну, раз вы собираетесь пользоваться MVVM, то вы, вероятно, захотите обновлять данные в VM так, чтобы обновлённые данные автоматически отображались в UI. Для этого вашему VM-классу нужно будет имплементировать INotifyPropertyChanged.

READ ALSO
Проблема при роботе с потоками C#

Проблема при роботе с потоками C#

Имею такую часть кода в функции

310
Не могу вызвать функцию из dll в C#

Не могу вызвать функцию из dll в C#

Пытаюсь вызвать функцию rgethstpar_date из библиотеки Honeywell hscnetapidll в C# 4 VS 2010

357
Конвертер DateTime из dataGridView в MsSql

Конвертер DateTime из dataGridView в MsSql

Доброе утро, у меня из бд отображается datagridView, проблема в том что последний столбец является типом datetime и обратно из грида в бд он не парсится...

254
Видео плеер своими руками на C#

Видео плеер своими руками на C#

Всем приветХочу попробовать сделать видео плеер, который будет читать следующие форматы: AVI, WMV, MOV, MKV, 3gp и т

475