这有点奇怪,但我真的找不到任何地方的工作示例。
顺便说一句,如果这很重要的话,我正在使用ViewModel-first方法(在WPF中)。
提前谢谢。
答案 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
的位置使用TreeViewModelShellView
<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);
}
}
}