2013-12-16 4 views
5

Es ist ein bisschen komisch, aber ich kann nirgends ein funktionierendes Beispiel finden.Kann jemand irgendein einfaches Arbeitsbeispiel des Leiters <T> .Collection.AllActive Verwendung zur Verfügung stellen?

Übrigens verwende ich einen ViewModel-First-Ansatz (in WPF), wenn dies wichtig ist.

Vielen Dank im Voraus.

+0

Was Sie davon erreichen wollen –

+0

Wir wollen drei Ansichten mit ViewModels in einen "Container" laden. – EngineerSpock

+0

Antwort unten funktioniert für Sie? –

Antwort

8

Wenn Sie einen Blick auf die Diskussion here haben, werden Sie sehen, dass die Absicht von AllActive darin besteht, mehrere Views/ViewModels in ein enthaltendes ViewModel zu schreiben. Nach Ihren früheren Kommentaren zu urteilen, scheint es, als ob Sie das erwartet hätten, aber ich dachte mir, ich würde es hier zumindest erwähnen.

Dann erwähnen Sie die Aktivierung von 3 verschiedenen ViewModels in verschiedenen Bereichen der Ansicht. Die Art und Weise, wie ich das in der Vergangenheit gehandhabt habe, besteht in separaten Eigenschaften für das Binden/Referenzieren der ViewModels in der Ansicht und das anschließende Hinzufügen aller Elemente zu Items, um das Conductor-Verhalten zu erhalten.

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

Und in MyView würden Sie so etwas haben. Natürlich können Sie diese ContentControls wo immer Sie möchten in der Ansicht setzen.

Eine andere häufige Verwendung für AllActive ist, wenn Sie eine Liste von Elementen haben. Aber die Elemente sind komplex genug, um ihre eigenen View/ViewModels zu rechtfertigen, die aktiviert werden müssen. In diesem Fall müssten Sie keine separaten Eigenschaften für die Ansichten haben, da Sie einfach x:Name des Listensteuerelements auf Items setzen würden.

0

Sie können wie unten implementieren, verwenden TreeViewModel am Ort der 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> 

Ansichtsmodell

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

Wie sollte ShellView aussehen? – EngineerSpock

+0

Aktualisiert meine Antwort –

+0

Dies funktioniert nur für TabControl? – EngineerSpock

Verwandte Themen