首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将MVVM事件、事件、处理程序、EventSetter模式转换为CodeBehind模式?

如何将MVVM事件、事件、处理程序、EventSetter模式转换为CodeBehind模式?
EN

Stack Overflow用户
提问于 2011-10-19 10:56:00
回答 3查看 3.9K关注 0票数 0

我正在尝试将事件、处理程序、EventSetter等WPF事件转换为CodeBehid模式。我不允许使用System.Windows.Controls,因为我使用的是MVVM。我也在避免使用第三方库来解决这个问题。

谁能解释一下如何将下面的CodeBehind事件处理程序转换成MVVM事件处理程序?请在写答案时尽可能多地解释。

XAML代码

代码语言:javascript
复制
<DataGridCheckBoxColumn Header="Select" Binding="{Binding Path=IsSelected}"> 
  <DataGridCheckBoxColumn.CellStyle> 
    <Style TargetType="DataGridCell"> 
      <EventSetter Event="MouseLeftButtonUp" Handler="ApprovedMouseUp"></EventSetter> 
    </Style> 
  </DataGridCheckBoxColumn.CellStyle> 
</DataGridCheckBoxColumn> 

代码隐藏

代码语言:javascript
复制
private void ApprovedMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    if(sender is DataGridCell) 
    { 
        var temp = (sender as DataGridCell).Content; 
        if(temp is CheckBox) (temp as CheckBox).IsChecked = !(temp as CheckBox).IsChecked; 
    } 
} 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-19 12:58:36

关于MVVM,有几条经验法则...

您的ModelsViewModles不应引用System.Windows.Controls namespace.

  • Your Models,而ViewModles不应处理事件。为that.

  • RoutedCommand使用ICommand接口在Models / ViewModels中无效(由于第2点)。因此,请使用DelegateCommand / RelayCommand

话虽如此,如果你已经在MVVM中写了一个,那么以上所有的几点都是完全允许的。

票数 1
EN

Stack Overflow用户

发布于 2011-10-19 11:10:06

您有几个选择:

  1. 在XAML中附加事件处理程序,但事件处理程序所做的唯一一件事就是调用视图模型,传入适当的参数(不要将任何GUI级项目传递给视图模型,这一点很重要--只传递执行操作所需的数据)
  2. 使用EventToCommand行为(如此处所示)将ICommand的实例(来自视图模型)附加到视图

中的事件

只要您不想在样式或模板中设置这些事件处理程序,我建议使用选项#1 --没有铁律禁止您在方便的时候使用事件处理程序,只要视图模型实际执行所有工作

编辑:选项#1

代码语言:javascript
复制
private void ApprovedMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    if(sender is DataGridCell) 
    { 

        var checkBox= (sender as DataGridCell).Content as CheckBox; 
        if(checkBox != null) 
        {
            var viewModel = (MyViewModel)checkBox.DataContext;
            viewModel.ToggleApprovedStatus();
        }
    } 
} 
票数 1
EN

Stack Overflow用户

发布于 2011-10-19 13:50:01

还可以使用Caliburn Micro库将ViewModel中的处理程序附加到视图中的事件。

示例代码:

代码语言:javascript
复制
 ...  xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"....

 <Button Content="Edit" DataContext="{Binding Path=VmInstance}" 
             cal:Message.Attach="[Event Click] = [Action EditFilter]" />
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7816067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档