WPF. Закрытие приложения MVVM

155
05 октября 2018, 19:20

View

<Window x:Class="ToDo.MainWindow"
    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:ToDo"
    mc:Ignorable="d"
    Title="MainWindow" Height="600" Width="1100" WindowStyle="None" AllowsTransparency="True">
<Grid >
    <Grid.RowDefinitions>
        <RowDefinition Height="40*"/>
        <RowDefinition Height="40*"/>
        <RowDefinition Height="40*"/>
        <RowDefinition Height="40*"/>
        <RowDefinition Height="499*"></RowDefinition>
        <RowDefinition Height="40*"></RowDefinition>
        <RowDefinition Height="31*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="40*"></ColumnDefinition>
        <ColumnDefinition Width="367*"></ColumnDefinition>
        <ColumnDefinition Width="644*"></ColumnDefinition>
        <ColumnDefinition Width="40*"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid Grid.Column="1" Grid.Row="0" Background="#FFF9B3AA" Grid.ColumnSpan="4"></Grid>
    <Grid Grid.Column="0" Grid.Row="0" Background="#FFF46F5E" Grid.RowSpan="7"></Grid>
    <Grid Grid.Column="1" Grid.Row="1" Background="#FFF89284" Grid.RowSpan="6"></Grid>
    <Grid Grid.Column="2" Grid.Row="1" Background="White" Grid.ColumnSpan="2" Grid.RowSpan="6"></Grid>
    <Button x:Name="btnClose" Grid.Column="3" Grid.Row="0" Background="{x:Null}" BorderThickness="0">
        <Image Source="Images/close.png" Stretch="Fill"></Image>
    </Button>
    <Button x:Name="btnMenu" Grid.Column="0" Grid.Row="1" Background="{x:Null}" BorderThickness="0">
        <Image Source="Images/menu.png" Stretch="Uniform"></Image>
    </Button>
    <Button x:Name="btnAdd" Grid.Column="0" Grid.Row="2" Background="{x:Null}" BorderThickness="0">
        <Image Source="Images/plus.png" Stretch="Uniform"></Image>
    </Button>
    <Button x:Name="btnList" Grid.Column="0" Grid.Row="3" Background="{x:Null}" BorderThickness="0">
        <Image Source="Images/todo.png" Stretch="Uniform"></Image>
    </Button>
    <Button x:Name="btnSettings" Grid.Column="0" Grid.Row="5" Background="{x:Null}" BorderThickness="0">
        <Image Source="Images/setting.png" Stretch="Uniform"></Image>
    </Button>       
</Grid>

Класс ViewModel:

class ViewModel
{
    public void Close()
    {
        this.Close();
    }
}

Как сделать Binding к кнопке "btnClose", чтобы приложение выполняла метод?

Answer 1

Вся эта магия реализуется через интерфейс ICommand.
Класс команды:

public class RelayCommand : ICommand
    {
        private readonly Action _action;
        public RelayCommand(Action action)
        {
            _action = action;
        }
        public event EventHandler CanExecuteChanged = (sender, args) => { };
        public bool CanExecute(object parameter) => true;
        public void Execute(object parameter)
        {
            _action();
        }
    }

Ваши фактические команда внутри модели:

  // По-хорошему, емнип, модель не должна знать об окне, но для разъяснения подойдёт
  this.CloseCommand = new RelayCommand(() => SystemCommands.CloseWindow(myWindow));

Биндинг в XAML:

<Button Command="{Binding CloseCommand"}>
</Button>
READ ALSO
Не обновляется datagridview при очистке базы данных sql

Не обновляется datagridview при очистке базы данных sql

Излазил уже просторы интернета, но до сих пор не понял как правильно обновить datagridview Что делаю не так?

158
Использование UserControl в ListBoxItem

Использование UserControl в ListBoxItem

подскажите пожалуйста, ради эксперимента в качестве Item ListBox использую вместо шаблона UserControl который связан в словаре ресурсов с моделью представления...

174
Сохранение ключей в базе данных

Сохранение ключей в базе данных

Хочу сохранять пароли в базе с помощью RSAЯ так понял по примеру - https://msdn

172
UnitTest проерить текст на валидацию

UnitTest проерить текст на валидацию

У меня есть некий коммент, нужно написать unittest на проверку что он не может быть пустым и не может быть меньше 10 символовВ контроллере проверка...

165