Закройте Windows при изменении текста TextBox с помощью Mvvm, Wpf, C #, Visual Studio - PullRequest
1 голос
/ 16 апреля 2019

Я хочу выполнить метод для события TextChange и для конкретного текста, я хочу что-то сделать и закрыть окно, используя MVVM

, например, для этой части моего кода я хочу закрыть свое окно:

if (text.Equals("12345"))
{
   //Exit from window
}

Я знаю, как я могу сделать это с помощью кнопки, используя команду, как в коде следующего примера.

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

или есть другой способ закрыть форму?

Я хочу сделать это в ViewModel, а не в коде, чтобы написать свой код в виде шаблона MVVM, так что я могу

мой код XAML:

<Window x:Class="PulserTesterMultipleHeads.UserControls.TestWindows"
        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:PulserTesterMultipleHeads.UserControls"
        mc:Ignorable="d"
        Name="MainTestWindow"
        Title="TestWindows" Height="450" Width="800">
    <Grid>
        <StackPanel>

            <TextBox Text="{Binding Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>

            <Button Command="{Binding EndTestExit}"
                    CommandParameter="{Binding ElementName=MainTestWindow}">Exit</Button>
        </StackPanel>
    </Grid>
</Window>

код XAML:

using PulserTesterMultipleHeads.Classes;
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.Shapes;

namespace PulserTesterMultipleHeads.UserControls
{
    /// <summary>
    /// Interaction logic for TestWindows.xaml
    /// </summary>
    public partial class TestWindows : Window
    {
        public TestWindows()
        {
            InitializeComponent();
            DataContext = new TestWindowsMV();
        }
    }
}

Просмотр Код модели:

using PulserTester.ViewModel.Base;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace PulserTesterMultipleHeads.Classes
{
    public class TestWindowsMV : INotifyPropertyChanged
    {
        private string text;
        public string Text {
            get {
                return text;
            } set {
                text = value;
                if (text.Equals("12345"))
                {
                    //Exit from window
                }

            }
        }


        /// <summary>
        ///  for the example
        /// </summary>
        private ICommand _EndTestExit;

        public ICommand EndTestExit
        {
            get
            {
                if (_EndTestExit == null)
                {
                    _EndTestExit = new GenericRelayCommand<Window>((window) => EndTestExitAction(window));
                }
                return _EndTestExit;
            }
        }

        private void EndTestExitAction(Window window)
        {
            window.Close();
        }


        public event PropertyChangedEventHandler PropertyChanged;
    }
}

************************* Редактировать в качестве ответа **************************** Изменение в ModelView:

public string Text {
            get {
                return text;
            } set {
                text = value;
                if (text.Equals("12345"))
                {
                    CloseAction();
                }

            }
        }

Изменение вкод позади:

public TestWindows()
        {
            InitializeComponent();
            DataContext = new TestWindowsMV();

            if (((TestWindowsMV)DataContext).CloseAction == null)
                ((TestWindowsMV)DataContext).CloseAction = new Action(this.Close);

        }

Ответы [ 3 ]

2 голосов
/ 16 апреля 2019

С MVVM это довольно сложно, но вы можете создать Событие внутри вашей ViewModel и прикрепить функцию, которая закроет ваше окно в коде позади вашего View.Тогда вы сможете вызывать ваше событие внутри ViewModel всякий раз, когда вам нужно закрыть окно (или сделать что-то еще, что более удобно сделать в View, а не в ViewModel)

0 голосов
/ 16 апреля 2019

Самый чистый способ закрыть View из ViewModel - использовать прикрепленное свойство

public static class perWindowHelper
{
    public static readonly DependencyProperty CloseWindowProperty = DependencyProperty.RegisterAttached(
        "CloseWindow",
        typeof(bool?),
        typeof(perWindowHelper),
        new PropertyMetadata(null, OnCloseWindowChanged));

    private static void OnCloseWindowChanged(DependencyObject target, DependencyPropertyChangedEventArgs args)
    {
        if (!(target is Window view))
            return;

        if (view.IsModal())
            view.DialogResult = args.NewValue as bool?;
        else
            view.Close();
    }

    public static void SetCloseWindow(Window target, bool? value)
    {
        target.SetValue(CloseWindowProperty, value);
    }


    public static bool IsModal(this Window window)
    {
        var fieldInfo = typeof(Window).GetField("_showingAsDialog", BindingFlags.Instance | BindingFlags.NonPublic);
        return fieldInfo != null && (bool)fieldInfo.GetValue(window);
    }
}

, которое затем можно привязать к соответствующему свойству в вашей ViewModel

<Window
    x:Class="...

    vhelp:perWindowHelper.CloseWindow="{Binding ViewClosed}">



private bool? _viewClosed;
public bool? ViewClosed
{
    get { return _viewClosed; }
    set { Set(nameof(ViewClosed), ref _viewClosed, value); }
}

Подробнееподробности о моем недавнем блоге .

0 голосов
/ 16 апреля 2019

У вас уже есть все, что вам нужно, уже реализовано.Все, что вам действительно нужно сделать, это позвонить private void EndTestExitAction(Window window) из вашего установщика и предоставить window его значение во время построения:

public string Text {
            get {
                return text;
            } set {
                text = value;
                if (text.Equals("12345"))
                {
                    EndTestExitAction(window)
                }

            }
        }

, где window является свойством вашей модели представления.

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