正如在 SimpleMDI Caliburn Micro 项目中所看到的,有一些约定将 tabControls 中的 selectionEvent 绑定到 Conductor 中的 ActivateItem。我真的看不到任何关于这个事件可能是什么的提及。
但是,当您的控件不能满足这些约定时,我就不知道如何自己管理它们了。
我有一个Telerik RadTreeView,我想用导体进行管理,以便能够按需加载节点的子节点(通过WCF调用)。
这是我所在的地方:
<telerik:RadTreeView x:Name="Items"
cal:Message.Attach="[Event Selected] = [ActivateItem($dataContext)]" />
传递$dataContext是错误的,因为这样他就会传递导体本身,$SelectedItem返回 null。
所以我相当简单的问题是三重的。
1)如果RadTreeView是一个Selecetor,为什么基本的CM约定不能与它一起使用,
2) 我应该使用什么事件来调用活动项
3)我可以传递什么。
这可能有助于理解执行树视图和 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();
}
因此,这适用于树中的任何级别,也适用于具有不同的行为,检查是否实现了不同事物的接口。
xaml for the RadTreeView
<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)]"/>