Привязка свойства "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 изменяет только состояние окна.