コマンドでウィンドウの状態を変更するために、メイン ウィンドウの "WindowState" プロパティを ViewModel にバインドしましたが、最初にウィンドウを最小化すると、Excel ファイルのワークシートのように最小化されます。ウィンドウが正しく最小化されるように、これを回避する方法、または「WindowState」プロパティを ViewModel にバインドする正しい方法はありますか?
17577 次
4 に答える
21
これはRelaying Command Logicでテストされた回避策のサンプルです。Model-View-ViewModel デザイン パターンを使用した WPF アプリについて詳しく説明します。
<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");
}
}
}
于 2011-01-13T05:41:10.340 に答える
9
ビューモデルのウィンドウの状態を気にする必要はないと思います。下位レベルのレイヤーが上位レベルのレイヤーを認識しているため、完全に間違っています (したがって、懸念の分離 (SOC) が間違っています)。
この場合、私が通常行うことは、ビュー モデルを含むコントロールまたはウィンドウ (つまりビュー) のコード ビハインドからビュー モデルの変更をサブスクライブすることです。この場合、ビューでのみ使用されるため、コード ビハインドにコードを記述することは有効です (したがって、コード ビハインドはこのロジックに最適な場所であり、ユニット テストを行う必要はありません)。
于 2011-01-13T09:29:34.193 に答える
1
考慮すべきもう 1 つのオプションは、コマンドとイベントの両方を介してコード ビハインドにサブスクライブすることです。
<Button Command="{Binding SnoozeCommand}" Click="Button_Click">Snooze</Button>
この場合のコマンドは VM に影響します。Click イベントは、ウィンドウの状態のみを変更します。
于 2011-12-12T08:33:55.730 に答える