从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)我可以传递什么。
答案 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)]"/>