【问题标题】:Is it possible to bind a WPF Event to MVVM ViewModel command? [duplicate]是否可以将 WPF 事件绑定到 MVVM ViewModel 命令? [复制]
【发布时间】:2014-08-05 19:12:49
【问题描述】:

我有一个 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}">

这是我的视图模型。

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

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

还有其他方法吗?

【问题讨论】:

  • 我将Window.StateChanged 事件绑定到ICommand,但它不起作用?...真的吗?那是为什么?可能是因为ICommand 不是事件?
  • @RohitVats,您是如何设法将这个问题作为一个重复的没有接受答案的问题关闭的?我不认为我们能做到这一点。
  • 好吧,这行不通。但是还有其他方法可以做到这一点吗?我确实找到了一种方法将 RoutedEvent 绑定到来自这里的命令 Binding RoutedEvent to Command 但是 StateChanged 不是 RoutedEvent?有没有其他方法可以做到这一点?
  • 好吧,这行不通...为什么不呢?它对其他人有用吗?或者,只需在后面的代码和处理程序中处理Window.StateChanged 事件,只需执行您的ICommandvar viewModel = (SomeDataType)DataContext; viewModel.YourCommand.Execute(params);
  • @Sheridan - 好的。我将重新打开这个问题,但大多数投票的答案肯定有效。不知道 OP 如何使用它。

标签: c# wpf


【解决方案1】:

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

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

【讨论】:

  • NotifyPropertyChanged 仅在您想从代码中更改 CurrentWindowState 并希望通知 UI 时才需要,以便您能够从视图模型中最小化/最大化/...您的窗口
  • 为了让它更好,将你的设置器更改为if (_currentWindowState != value) { _currentWindowState = value; if (_currentWindowState == WindowState.Minimized) { ... } ... }
【解决方案2】:

是的,您可以将事件绑定到您的模型,但您需要帮助。 您需要使用 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

【讨论】:

  • Caliburn 让您可以使用消息(以及更少的代码)来实现。
猜你喜欢
  • 2014-11-06
  • 1970-01-01
  • 2011-11-07
  • 2012-06-17
  • 2011-06-21
  • 2014-09-01
  • 2012-02-23
  • 2011-04-04
相关资源
最近更新 更多