Caliburn.Micro自定义ViewModelLocator:绑定ItemContainerStyle

时间:2016-06-22 19:50:35

标签: c# wpf caliburn.micro xceed viewmodellocator

我正在使用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的

1 个答案:

答案 0 :(得分:0)

您是否尝试使用let indices: IndexSet = [1, 2, 3] 告诉caliburns视图绑定引擎查找模型的视图,而不是DataTemplate?