Привязка свойства "WindowState" окна в WPF с помощью MVVM

я привязал свойство "WindowState" моего главного окна к моей ViewModel, чтобы изменить состояние окна командой, но при первом сворачивании окна оно сворачивается, как лист в файле Excel. Есть ли работа для этого или правильный способ привязать свойство "WindowState" к моей ViewModel, чтобы окно правильно минимизировалось?

3 ответов


Я не думаю, что вы должны заботиться о состоянии окна в модели представления, это совершенно неправильно, потому что слой нижнего уровня знает слой более высокого уровня (таким образом, неправильное разделение проблем (SOC)).

то, что я обычно делаю в этом случае-это подписаться на изменения в вид модели с выделенным кодом управления или окна (таким образом), содержащие вид модели. В этом случае допустимо писать код в коде, поскольку он используется только в представлении (и, следовательно, code-behind-идеальное место для этой логики, которую вы действительно не хотите тестировать).


это образец работы вокруг того, что проверено с Передача Логики Команды. Вы получите более подробную информацию о приложения WPF с шаблоном дизайна Model-View-ViewModel .

<Window x:Class="WpfMvvmTestCSharp.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:WpfMvvmTestCSharp"
    Title="Window1" Height="300" Width="300" WindowState="{Binding CurWindowState, Mode=TwoWay}">
    <Window.DataContext>
        <vm:Window1ViewModel/>
    </Window.DataContext>
    <Grid>
        <Button Command="{Binding CmdMax}" Height="23" Margin="12,25,0,0" Name="button1" VerticalAlignment="Top" HorizontalAlignment="Left" Width="75">Maximize</Button>
        <Button Command="{Binding CmdMin}" Height="23" Margin="101,25,102,0" Name="button2" VerticalAlignment="Top">Minimize</Button>
        <Button Command="{Binding CmdRes}" Height="23" HorizontalAlignment="Right" Margin="0,25,13,0" Name="button3" VerticalAlignment="Top" Width="75">Restore</Button>
    </Grid>
</Window>

и в Windows ViewModel

class Window1ViewModel:ViewModelBase
    {
        public Window1ViewModel()
        {
            CurWindowState = WindowState.Maximized;
        }

        public ICommand CmdMax
        {
            get { return new RelayCommand(param => onCmdMax()); }
        }

        void onCmdMax()
        {
            CurWindowState = WindowState.Maximized;
        }
        public ICommand CmdMin
        {
            get { return new RelayCommand(param => onCmdMin()); }
        }
        void onCmdMin()
        {
            CurWindowState = WindowState.Minimized;
        }
        public ICommand CmdRes
        {
            get { return new RelayCommand(param => onCmdRes()); }
        }

        void onCmdRes()
        {
            CurWindowState = WindowState.Normal;
        }

        private WindowState _curWindowState;
        public WindowState CurWindowState
        {
            get
            {
                return _curWindowState;
            }
            set
            {
                _curWindowState = value;
                base.OnPropertyChanged("CurWindowState");
            }
        }
    }

другой вариант для рассмотрения-подписка как с помощью команды, так и с помощью события на код, e.g:

    <Button Command="{Binding SnoozeCommand}" Click="Button_Click">Snooze</Button>

команда в этом случае влияет на виртуальной машине. Событие Click изменяет только состояние окна.