Использование MVVM с Frame - PullRequest
       4

Использование MVVM с Frame

0 голосов
/ 09 февраля 2020

Я хочу сделать фрейм невидимым при изменении текста в моей записи. Пока я пытался с. И сделать видимым, когда текст не изменился.

Мой класс MVVM

public  class MVVM { 
  public  bool IsVisible = true;
    public bool IsShowFrame
    {
        get => IsVisible;
        set
        {
            IsVisible = value;
        }
    }
}

xaml

<Entry x:Name="entryName"  TextChanged="justchill_TextChanged"/>
<Frame  BackgroundColor="Gray" Margin="10" x:Name="FramesName" IsVisible="{Binding  IsVisible}" />

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

1 Ответ

3 голосов
/ 09 февраля 2020

Я действительно смущен кодом, но я думаю, что знаю, что вы пытаетесь сделать ..

На вашем MVVM CLASS вам нужно будет реализовать INotifyPropertyChanged. Чтобы сделать это, вам нужно добавить необходимые пространства имен, Eventhandler и «триггер». Для простоты я собираюсь начать ваш класс с нуля - вы можете вручную добавить эти части в существующий код, если вам нужно.

Часть 1 - Правильная настройка класса MVVM

Шаг 1: Добавьте необходимые с помощью операторов в начало страницы:

using System.ComponentModel;   
using System.Runtime.CompilerServices;

Шаг 2: Добавьте INotifyPropertyChanged - вы получите немедленную «ошибку» - проигнорируйте ее, пока мы не закончили.

 public class MVVM : INotifyPropertyChanged
 {

 }

Шаг 3: Добавить EventHandler (который исправляет ошибку из шага 2):

 public class MVVM : INotifyPropertyChanged
 {

     public event PropertyChangedEventHandler PropertyChanged;
 }

Шаг 4: Добавить триггер:

 public class MVVM : INotifyPropertyChanged
 {
    private void OnPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
 }

Со всем этим, вы уже готовы начать добавлять свои свойства. Я сделал несколько изменений в зависимости от того, что я предполагаю, что вы пытаетесь сделать. вам нужно будет обновить свою страницу / пользовательский интерфейс следующим ... Вот завершенный код, который включает комментарии о том, что я сделал:

public class MVVM : INotifyPropertyChanged
{
    // Set to Private since we NEVER want MVVM binding to this property becuase it DOES NOT 
    // call the 'OnPropertyChanged' whenever the value is changed 
    private bool _isShowFrame= true;  
    public bool IsShowFrame
    {
        get => _isShowFrame;
        set
        {
            // We check to see if the value has changed, if it hasn't we're done. 
            if (_isShowFrame == value) return;

            // If the value HAS changed, we will save the new value here. 
            _isShowFrame = value;

            // We will now let everyone know that the value has changed! This will update your UI!
            OnPropertyChanged(); 
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Вот свойство для Имя пользователя, которое будет обновляться в MVVM - вы увидите, как я использую ту же структуру, и при каждом изменении свойства вызываем OnPropertyChanged:

    private string _userName; 
    public string UserName
    {
        get => _userName;
        set
        {
            if (_userName == value) return;
            _userName = value;
            OnPropertyChanged(); 
        }
    }

ЧАСТЬ 2 - Исправление страницы / формы

Ваша страница / окно Состоит из двух частей - кода XAML и «кода позади», который написан на C# (в вашем случае). Code-Behind содержит все «события», такие как нажатие кнопки, и другие вещи, которые вы в нее встроили.

Вы не предоставили много кода, поэтому мы представим, что ваша страница XAML называется MainWindow - поэтому в Visual Studio она называется "Main Window.xaml". C# «код позади» называется «Main Window.xaml.cs»

XAML:

<Entry x:Name="entryName"  TextChanged="entryName_TextChanged"/>
<Frame  BackgroundColor="Gray" Margin="10" x:Name="FramesName" IsVisible="{Binding  IsShowFrame}" />

MainWindow.xaml.cs - Опять же - Вы Я не предоставил большого количества кода, поэтому я не могу дать вам точный код. Помните - «MainWindow» - это готовая страница, с которой, я предполагаю, мы работаем. Замените 'MyProgram' в этом коде именем вашего приложения / пространства имен по умолчанию

public partial class MainWindow : UserControl
{
    MyProgram.MVVM mvvm = new MyProgram.MVVM();
    public MainWindow()
    {
        InitializeComponent();
        DataContext = mvvm;
    }

    protected void entryName_TextChanged(object sender, TextChangedEventArgs e)
    {
      mvvm.IsShowFrame = false;
    }

}

Этот ответ дает вам основы использования MVVM - вы узнали, как настроить свойство автоматически запускать обновления пользовательского интерфейса и устанавливать привязку (называемую DataContext). Если вы потратите время, чтобы понять, что происходит в этом ответе - он ДЕЙСТВИТЕЛЬНО поможет вам.

Как только вы это заработаете, я бы посоветовал просмотреть мой ответ на похожий вопрос: Привязка Viewmodel к представлению - это научит вас, как изменять элементы из внешних классов и страниц, используя MVVM. Это может даже помочь вам понять, что происходит в этом вопросе тоже.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...