Слишком новое для UWP и MVVM. Я столкнулся с проблемой, которая может показаться очевидной для многих из вас.привязка данных UWP, не работающая с ViewModel
В моем проекте у меня есть 3 папки с именем Views
, ViewModels
и Models
, которые включают в себя некоторые файлы, как показано на рисунке ниже:
Can't upload image yet (reputation):
http://i.imgur.com/42f5KeT.png
Проблема: Я пытаюсь реализовать MVVM. Я искал часы для статей и видео, но кажется, что я всегда что-то пропускаю. У меня есть привязки в
LoginPage.xaml
, которые затем изменяю в классе внутриModels/LoginPageModel.cs
. У меня есть классINotifyPropertyChanged
в моем LoginPageViewModel.cs, где каждый раз, когда свойство изменяется в моемLoginPageModel.cs
, я хочу, чтобы запускался классINotifyPropertyChanged
, который затем изменит свойство в представленииLoginPage.xaml
. Ниже у меня есть содержимое этих файлов.
Это образец моего LoginPageModel.cs
кода:
using System;
using System.Threading.Tasks;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace App_Name.Models
{
class LoginPageModel
{
private NotifyChanges notify;
public async void LogIn()
{
if (something is true)
notify.LoginUIVisibility = Visibility.Visible;
}
}
}
Это мой LoginPageViewModel.cs
:
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Windows.UI.Xaml;
namespace App_Name.ViewModels
{
public class NotifyChanges : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private Visibility loginUIVisibility = Visibility.Collapsed;
public Visibility LoginUIVisibility
{
get
{
return loginUIVisibility;
}
set
{
if (value != loginUIVisibility)
{
loginUIVisibility = value;
NotifyPropertyChanged("LoginUIVisibility");
}
}
}
}
}
Вот пример LoginPage.xaml
:
<Page
x:Class="App_Name.LoginPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App_Name"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="using:App_Name.ViewModels"
mc:Ignorable="d">
<Page.DataContext>
<vm:NotifyChanges/>
</Page.DataContext>
<StackPanel Visibility="{Binding LoginUIVisibility}">
Вот мой LoginPage.xaml.cs
:
namespace App_Name
{
public sealed partial class LoginPage : Page
{
private LoginPageModel login;
public LoginPage()
{
InitializeComponent();
login.LogIn();
}
}
}
Я не знаю, почему это не работает. Привязки используются не для работы, но теперь во время выполнения это дает мне необработанное исключение, и я думаю, что это связано с тем, что не присваивается значение и
private LoginPageModel login
объектам, но я не знаю, что. Спасибо всем за ваше время заранее!
Пожалуйста, если вам нужны пояснения по моему вопросу, просто напишите комментарий. Спасибо!
В основном вы создаете новый объект notifyChanges (какое имя для ViewModel ...) и устанавливаете в нем свое свойство, почему вы ожидаете, что пользовательский интерфейс изменится, если у него есть другой экземпляр этого класса, заданного как DataContext? – RTDev
Итак, это входит в мой первоначальный конструктор страницы вместо XAML? И как я могу ссылаться на него в файле ViewModel? – KonKarapas
это один из возможных способов сделать это, в construtor (в файле xaml.cs) создать экземпляр ViewModel, сохранить ссылку на него и установить его как DataContext, теперь, когда вы будете играть со свойствами этого ссылочного объекта, пользовательский интерфейс должен изменить привязку корыта – RTDev