我正在使用Xceed工具包WindowContainer和ChildWindows生成一个由多个窗口(容器)组成的动态客户端区域,每个窗口包含多个自定义用户控件(元素)。这些窗口可以在WindowContainer区域中自由移动,调整大小和最大化。
要在ViewModel级别表示层次结构,我使用Caliburn.Micros导体机制。 所以MainViewModel执行容器:
public class MainViewModel : Conductor<ElementContainerViewModel>.Collection.AllActive
并且容器执行元素:
public class ElementContainerViewModel : Conductor<ElementViewModel>.Collection.AllActive
相应的视图如下所示(自定义项控件将ChildWindow替换为默认的ContentPresenter作为容器)。 MainView.xaml(为了简洁省略了ElementContainerView.xaml):
<childWindowContainer:MyItemsControl x:Name="Items" >
<childWindowContainer:MyItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<xctk:WindowContainer Height="800" Width="600" Background="LightGoldenrodYellow"/>
</ItemsPanelTemplate>
</childWindowContainer:MyItemsControl.ItemsPanel>
<childWindowContainer:MyItemsControl.ItemContainerStyle>
<Style>
<Setter Property="xctk:ChildWindow.Left" Value="{Binding ContainerLeft}" />
<Setter Property="xctk:ChildWindow.Top" Value="{Binding ContainerTop}" />
<Setter Property="xctk:ChildWindow.Width" Value="{Binding ContainerWidth}" />
<Setter Property="xctk:ChildWindow.Height" Value="{Binding ContainerHeight}" />
<Setter Property="xctk:ChildWindow.CloseButtonVisibility" Value="Collapsed" />
<Setter Property="xctk:ChildWindow.Content" Value="{Binding}" />
<Setter Property="xctk:ChildWindow.IsMaximized" Value="{Binding IsMaximized, Mode=TwoWay}" />
</Style>
</childWindowContainer:MyItemsControl.ItemContainerStyle>
</childWindowContainer:MyItemsControl>
引起我头痛的一行是以下内容,取自MainView itemscontrol:
<Setter Property="xctk:ChildWindow.Content" Value="{Binding}" />
绑定工作正常,但相应的视图未正确附加。所以我只是添加了一个老式的datatemplate来将容器ViewModel绑定到相应的视图:
<DataTemplate DataType="{x:Type viewModels:ElementContainerViewModel}">
<views:ElementContainerView />
</DataTemplate>
问题:由于ViewModel定位器进程不再由Caliburn.Micro完成,因此关闭应用程序会导致每个ChildWindow的null引用异常,这是由Caliburn.Micro关闭传导的ViewModel引起的,但不会关闭ElementContainerView。
我如何告诉Caliburn.Micro像在datatemplate中一样解析该约定。 View和ViewModel当然是正确组织的,因此默认约定可以启动(RootNS.ViewModels.ElementContainerViewModel.cs / RootNS.Views.ElementContainerView.xaml)。 我在摆弄使用ViewLocator.NameTransformer和ConventionManager但却无法使用它。
ConventionManager.AddElementConvention<ChildWindow>(ContentControl.ContentProperty, "Content",
"DataContextChanged");
ViewLocator.NameTransformer.AddRule(@"^ElementContainerViewModel", @"ChildWindowContainer.Views.ElementContainerView");
非常感谢, Ly的
答案 0 :(得分:0)
您是否尝试使用let indices: IndexSet = [1, 2, 3]
告诉caliburns视图绑定引擎查找模型的视图,而不是DataTemplate?