是否可以将WPF事件绑定到MVVM ViewModel命令?

时间:2014-08-05 10:18:20

标签: c# wpf

我有一个xaml窗口,在窗口的StateChanged事件中,我必须执行一段代码。我必须遵循MVVM。我将StateChanged属性绑定到ICommand?它不起作用。

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="DummyApp"
x:Name="Window"
Title="Dummy App"
Width="{Binding WindowWidth,Mode=OneWayToSource}" Height="{Binding WindowHeight}" ResizeMode="CanMinimize" Icon="Logo.png" SizeToContent="WidthAndHeight"  WindowStartupLocation="CenterScreen" WindowState="{Binding CurrentWindowState, Mode=TwoWay}"
ShowInTaskbar="{Binding ShowInTaskBar, Mode=TwoWay}" StateChanged="{Binding IsMinimized}">

这是我的viewmodel。

public ICommand IsMinimized
    {
        get
        {
            if (_IsMinimized == null)
            {
                _IsMinimized = new RelayCommand(param => this.OnMinimized(), null);
            }
            return _IsMinimized;
        }
    }

    private void OnMinimized()
    {
        //do something here
    }

还有其他方法吗?

2 个答案:

答案 0 :(得分:1)

是的,您可以将事件绑定到模型,但需要帮助。 您需要使用System.Windows.Interactivity Namespace中的函数并包含MVVM Light(可能有其他MVVM库具有该功能,但我使用MVVM Light)。

在窗口中包含以下命名空间

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras"

并绑定您的活动,例如

<i:Interaction.Triggers>
    <i:EventTrigger EventName="StateChanged">
        <cmd:EventToCommand Command="{Binding StateChangedCommand}" PassEventArgsToCommand="True" />
    </i:EventTrigger>
</i:Interaction.Triggers>

HTH

答案 1 :(得分:1)

感谢您的帮助。但我最终将WindowState绑定到属性并在那里处理代码。

public WindowState CurrentWindowState
    {
        get { return _currentWindowState; }
        set
        {
            _currentWindowState = value;
            if (_currentWindowState == WindowState.Minimized)  //any other clause here
            {
               //do something here
            }
            NotifyPropertyChanged("CurrentWindowState");
        }
    }