8

コマンドでウィンドウの状態を変更するために、メイン ウィンドウの "WindowState" プロパティを ViewModel にバインドしましたが、最初にウィンドウを最小化すると、Excel ファイルのワークシートのように最小化されます。ウィンドウが正しく最小化されるように、これを回避する方法、または「WindowState」プロパティを ViewModel にバインドする正しい方法はありますか?

4

4 に答える 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 に答える