Caliburn Micro:如何将ActivateItem绑定到Conductors中的selectionEvents

时间:2012-07-03 12:10:34

标签: wpf caliburn.micro rad-controls convention-over-configur

从SimpleMDI Caliburn Micro项目中可以看出,有一些约定将tabControls中的selectionEvent绑定到Conductor中的ActivateItem。我真的没有看到这个事件可能是什么。

然而,当你的控件没有满足这些约定时,我就失去了如何自己管理它们。

我有一个Telerik RadTreeView,我想与导体一起管理,以便能够按需加载节点的子节点(通过WCF调用)。

我在这里:

<telerik:RadTreeView x:Name="Items"
                     cal:Message.Attach="[Event Selected] = [ActivateItem($dataContext)]"  />

传递$ dataContext是错误的,因为他传递了Conductor本身,$ SelectedItem返回null。

所以我的相当简单的问题是三重的。

1)如果RadTreeView是Selecetor,为什么基本的CM约定不适合它,

2)我应该使用什么事件来调用ActiveItem

3)我可以传递什么。

1 个答案:

答案 0 :(得分:1)

This可能有助于理解进行树视图和mvvm的不同方法。

我也在使用RadTreeView,最后我将事件发送到托管Items TreeViewItemViewModel集合的ViewModel。当一个动作/事件(例如,编辑)被发送到MainViewModel时,我有一个方法,如:

 public void Edited(object sender, RadTreeViewItemEditedEventArgs e)
        {
            var treeViewItemViewModel = e.NewValue as IEditable;
            if (treeViewItemViewModel == null) return;

            treeViewItemViewModel.EndEdit();
        }

因此,这适用于树中的任何级别,并且还可以处理不同的行为,检查是否实现了不同内容的接口。

RadTreeView的xaml

 <telerik:RadTreeView x:Name="MyTree"
                                     Grid.Row="1"
                                     Margin="0,20,0,0"
                                     VerticalAlignment="Stretch"
                                     FontSize="16"
                                     FontFamily="{StaticResource MainFontFamily}"
                                     ItemsSource="{Binding Children, Mode=TwoWay}"
                                     ItemTemplate="{StaticResource HierarchicalDataTemplate}"
                                     ItemEditTemplateSelector="{StaticResource ItemEditTemplateSelector}"
                                     ItemEditTemplate="{x:Null}"
                                     IsLoadOnDemandEnabled="True"
                                     IsEditable="True"
                                     IsDragDropEnabled="True"
                                     DropExpandDelay="00:00:01"
                                     telerik:TextSearch.TextPath="ItemId"
                                     PathSeparator="|"
                                     cal:Message.Attach="
                                    [Event LoadOnDemand] = [Action LoadOnDemand($eventArgs)];
                                    [Event PreviewDragStarted] = [Action PreviewDragStarted($source,$eventArgs)];
                                    [Event PreviewDragEnded] = [Action PreviewDragEnded($source,$eventArgs)];
                                    [Event DragEnded] = [Action DragEnded($source,$eventArgs)];
                                    [Event Edited] = [Action Edited($source,$eventArgs)];
                                    [Event EditCanceled] = [Action EditCanceled($source,$eventArgs)]"/>