使用Caliburn.Micro将SelectionChanged绑定到ViewModel

15

我们正在一个新的Silverlight项目中使用Caliburn.Micro,一切都很好。内置的约定将按钮的点击事件绑定到了viewModel,但我不确定如何最好地处理datagrids和comboboxes上的selectionChanged事件。

目前,我绑定到所选项并调用自定义逻辑,但我觉得这有点像代码异味,我应该将属性设置和selectedChange事件分开。但如果我将它们分开,如何将选择更改事件绑定到我的viewModel?通过命令或EventTrigger吗?或者下面的代码是可接受的?虽然这只是一个小变化,但我在所有地方都这样做。

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

22

我经常使用这种技术,感觉非常舒适。
我认为让虚拟机自己响应其状态的变化是完全可以接受的,不需要外部参与者(顺便说一下,外部参与者可以是视图(View),也可以是其他组件)来设置新状态,然后再通知虚拟机状态已经改变。

如果你真的想这样做,你可以使用Message.Attach附加属性将View中的事件连接到VM中的操作:

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

(另请参见https://caliburnmicro.com/documentation/actions)


2
这里有一个MVVM和Caliburn.Micro的使用示例。一些操作,如SelectionChanged,需要明确地获取事件参数,因此您应该在caliburn事件操作部分中设置它。通常第一个参数传递$this(实际附加操作的UI元素),并且您在处理程序中获得了行的数据上下文,但要访问Grid,您应该传递$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();
    }

欢迎来到SO!解释一下代码为什么要这样写,不仅仅是“如何”,还有“为什么”。 - garfbradaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接