0

我正在使用 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}" />

绑定工作正常,但相应的视图未正确附加。所以我只是添加了一个老式的数据模板来将容器 ViewModel 绑定到其对应的视图:

<DataTemplate DataType="{x:Type viewModels:ElementContainerViewModel}">
   <views:ElementContainerView />
</DataTemplate>

问题:由于 ViewModel 定位器过程不再由 Caliburn.Micro 完成,关闭应用程序会导致每个 ChildWindow 出现空引用异常,这是由 Caliburn.Micro 关闭执行的 ViewModel 引起的,但没有关闭 ElementContainerView。

我如何告诉 Caliburn.Micro 像在数据模板中那样解决该约定。视图和视图模型当然是正确组织的,因此可以使用默认约定(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");

非常感谢,莉

4

1 回答 1

0

您是否尝试过使用cal:View.Model="{Binding}"来告诉 caliburns 视图绑定引擎来查找模型的视图,而不是 DataTemplate?

于 2016-06-22T21:05:46.040 回答