Can anybody provide any simple working example of the Conductor<T>.Collection.AllActive usage?

浪尽此生 提交于 2019-12-07 03:24:12

问题


It's a bit strange, but I really can't find a working example anywhere.

By the way, I'm using a ViewModel-first approach (in WPF) if this is important.

Thank you in advance.


回答1:


If you have a look at the discussion here you will see that the intent of AllActive is to compose several Views/ViewModels into a containing ViewModel. Judging from your previous comments it seems as if this is what you were expecting but I figured I'd at least reference it here.

You then mention activating 3 different ViewModels at different regions of the View. The way I've handled this in the past is to have separate properties for binding/referencing the ViewModels in the View, and then just adding all of them to Items to get the Conductor behavior.

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; }
}

And in MyView you would have something like this. Of course you could put these ContentControls wherever you want to in the view.

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

Another common use for AllActive is when you have a list of items. But the items are complex enough to warrant having their own View/ViewModels that require activation. In that case you would not have to have separate properties for the views as you would just set the x:Name of the list control to Items.




回答2:


You can do implement like below, use TreeViewModel at the place of TabViewModel

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>

ViewModel

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);
                }           
            }
        }


来源:https://stackoverflow.com/questions/20607168/can-anybody-provide-any-simple-working-example-of-the-conductort-collection-al

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!