【问题标题】:Binding SelectionChanged to ViewModel using Caliburn.Micro使用 Caliburn.Micro 将 SelectionChanged 绑定到 ViewModel
【发布时间】:2011-05-01 18:31:36
【问题描述】:

我们在一个新的 Silverlight 项目中使用了 Caliburn.Micro,一切正常。内置约定将按钮单击事件绑定到 viewModel,但我不确定在数据网格和组合框上处理 selectionChanged 事件的最佳方法是什么。

目前,我正在绑定到所选项目并调用自定义逻辑,但我觉得这有点代码味道,我应该将属性的设置和 selectedChange 事件分开。但是,如果我将这些分开,如何通过命令将选择更改事件绑定到我的视图模型?还是事件触发器?或者下面的代码可以接受吗?这是一个很小的变化,但我到处都在做这个逻辑。

private Foo _selectedFoo;
public Foo SelectedFoo
{
    get
    {
        return _Foo;
    }
    set
    {
        if (_Foo != null && _Foo.Equals(value)) return;
        _Foo = value;
        NotifyOfPropertyChange("SelectedFoo");
        NotifyOfPropertyChange("CanRemove");
        LoadRelatedBars();
    }
}

【问题讨论】:

    标签: silverlight viewmodel caliburn


    【解决方案1】:

    我经常使用这种技术,我觉得很舒服。
    我发现虚拟机对自己的状态变化做出反应非常好,不需要外部参与者(顺便说一下是视图,但也可能是另一个组件)来设置新状态,然后向虚拟机发出状态是改变了。

    但是,如果您真的想这样做,您可以使用 Message.Attach 附加属性将 View 中的事件与 VM 中的操作挂钩:

    cal:Message.Attach="[Event SelectionChanged] = [OnSelectionChangedAction]"
    

    (另见https://caliburnmicro.com/documentation/actions

    【讨论】:

      【解决方案2】:

      这是 MVVM 和 Caliburn.Micro 使用的示例。像 SelectionChanged 这样的一些动作应该得到一个明确的事件参数,所以你应该在 caliburn 事件动作部分设置它。通常,第一个参数是传递 $this(动作附加到的实际 ui 元素。)并且您在处理程序中获取该行的数据上下文,但要到达网格,您应该传递 $source 作为第一个参数($source -是触发要发送的 ActionMessage 的实际 FrameworkElement)。根据手册Caliburn manual.

      XAML

      cal:Message.Attach="[Event SelectionChanged]=[Action DataGrid_JobTypesSelectionChanged($source,$eventArgs)];"
      

      代码:

      public void DataGrid_JobTypesSelectionChanged(object sender, SelectionChangedEventArgs e)
          {
              var grid = sender as DataGrid;
              JobTypesSelectedCollection = grid.SelectedItems.Cast<JobComplexModel>().ToList();
          }
      

      【讨论】:

      • 欢迎来到 SO!解释 OP 代码的原因。不仅仅是“如何”,还有“为什么”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      相关资源
      最近更新 更多