代码之家  ›  专栏  ›  技术社区  ›  Kye

使用caliburn.micro将binding selection更改为viewModel

  •  14
  • Kye  · 技术社区  · 14 年前

    我们在一个新的Silverlight项目中使用了caliburn.micro,所有的功能都很好。内置约定将按钮click事件绑定到viewModel,但我不确定在数据报和组合框上处理SelectionChanged事件的最佳方法是什么。

    目前,我正在绑定到选定的项并调用自定义逻辑,但我觉得这有点代码味道,我应该将属性设置和SelectedChange事件分开。但是如果我分离这些,如何通过命令将selection-changed事件绑定到我的viewModel?还是一个事件触发器?或者下面的代码可以接受吗?这是一个小小的变化,但我在任何地方都做这个逻辑。

    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 回复  |  直到 7 年前
        1
  •  19
  •   less    7 年前

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

    但是,如果您确实想这样做,可以使用消息。附加附加属性将视图中的事件挂接到VM中的操作:

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

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

        2
  •  1
  •   Andrew Zagarichuk    7 年前

    这是MVVM和Caliburn.Micro使用的示例。某些操作(如selectionchanged)应获得显式的事件参数,因此应在Caliburn事件操作部分中进行设置。经常第一个参数传递$this(操作附加到的实际UI元素),您将处理该行的DataContext,但要到达网格,您应该传递$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();
        }