任何人都可以提供Conductor <t> .Collection.AllActive用法的任何简单工作示例吗?</t>

时间:2013-12-16 09:19:10

标签: wpf caliburn.micro

这有点奇怪,但我真的找不到任何地方的工作示例。

顺便说一句,如果这很重要的话,我正在使用ViewModel-first方法(在WPF中)。

提前谢谢。

2 个答案:

答案 0 :(得分:11)

如果你看一下讨论here,你会发现AllActive的意图是将几个Views / ViewModel组合成一个包含ViewModel。从你之前的评论来看,似乎这就是你所期待的,但我想我至少会在这里引用它。

然后提及在View的不同区域激活3个不同的ViewModel。我过去处理这个问题的方法是在视图中使用单独的属性来绑定/引用ViewModel,然后只将所有这些属性添加到Items中以获得指挥行为。

public sealed class MyViewModel : Conductor<Screen>.Collection.AllActive
{
    public MyViewModel(IMagicViewModelFactory factory)
    {
        FirstSubViewModel = factory.MagicallyGiveMeTheViewModelIWant();
        SecondSubViewModel = factory.MagicallyGiveMeTheViewModelIWant();
        ThirdSubViewModel = factory.MagicallyGiveMeTheViewModelIWant();

        Items.Add(FirstSubViewModel);
        Items.Add(SecondSubViewModel);
        Items.Add(ThirdSubViewModel);
    }

    public Screen FirstSubViewModel { get; private set; }
    public Screen SecondSubViewModel { get; private set; }
    public Screen ThirdSubViewModel { get; private set; }
}

在MyView中你会有这样的东西。当然,您可以将这些ContentControls放在视图中的任何位置。

<StackPanel>
    <ContentControl x:Name="FirstSubViewModel" />
    <ContentControl x:Name="SecondSubViewModel" />
    <ContentControl x:Name="ThirdSubViewModel" />
</StackPanel>

AllActive的另一个常见用途是当您有一个项目列表时。但这些项目非常复杂,需要保证自己的View / ViewModel需要激活。在这种情况下,您不必为视图设置单独的属性,因为您只需将列表控件的x:Name设置为Items

答案 1 :(得分:0)

您可以执行如下所示的工具,在TabViewModel

的位置使用TreeViewModel

ShellView

 <DockPanel>
        <Button x:Name="OpenTab"
                Content="Open Tab" 
                DockPanel.Dock="Top" />
        <TabControl x:Name="Items">
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding DisplayName}" />
                        <Button Content="X"
                                cal:Message.Attach="DeactivateItem($dataContext, 'true')" />
                    </StackPanel>
                </DataTemplate>
            </TabControl.ItemTemplate>
        </TabControl>
    </DockPanel>

视图模型

public class ShellViewModel : Conductor<IScreen>.Collection.AllActive {

            System.Collections.Generic.List<TabViewModel> tabViewModelCollection = new System.Collections.Generic.List<TabViewModel>();

            public void ActiveAllTab() {

                foreach (var tabViewModel in tabViewModelCollection)
                {
                    ActivateItem(tabViewModel);
                }           
            }
        }