Привязка свойства WindowState к окну в WPF с использованием MVVM - PullRequest
8 голосов
/ 12 января 2011

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

Ответы [ 3 ]

17 голосов
/ 13 января 2011

Это пример работы, протестированной с Relaying Command Logic . Вы получите более подробную информацию о приложениях 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");
            }
        }
    }
8 голосов
/ 13 января 2011

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

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

0 голосов
/ 12 декабря 2011

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

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

Команда в этом случае влияет на ВМ. Событие Click, только изменяет состояние окна.

...