15

我们在一个新的 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();
    }
}
4

2 回答 2

22

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

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

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

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

于 2010-10-28T10:30:43.703 回答
2

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

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();
    }
于 2017-07-06T13:24:32.217 回答