2013-12-16 18 views
5

Bu biraz garip, ama gerçekten her yerde çalışan bir örnek bulamıyorum.Herhangi biri, İletken <T> .Collection.AllAktif kullanımıyla ilgili basit bir çalışma örneği sunabilir mi?

Bu arada, bu önemliyse ViewModel ilk yaklaşımını (WPF'de) kullanıyorum.

Önceden teşekkür ederiz.

+0

Bundan kurtulmak istediğiniz şey –

+0

ViewModels ile üç kez bir "kapsayıcı" içine yüklemek istiyoruz. – EngineerSpock

+0

Yanıtınız sizin için çalışmış mı? –

cevap

8

Eğer tartışma here bir göz varsa göreceksiniz AllActive'nin amacının, bir çok View/ViewModel'i içeren bir ViewModel'e dahil etmektir. Önceki yorumlarınızdan yola çıkarak sanki beklediğiniz gibi geliyor ama en azından burada referans alacağımı düşündüm.

Daha sonra, Görünümün farklı bölgelerinde 3 farklı ViewModeli etkinleştirmeyi belirtin. Bunu geçmişte ele aldığım şekil, ViewModels'i View (Görünüm) 'de bağlama/referanslama için ayrı özelliklere sahip olmak ve ardından Conductor davranışını elde etmek için hepsini yalnızca Öğelere eklemektir.

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

Ve MyView'da bunun gibi bir şey olurdu. Tabii ki, bu ContentControls'u görünümde istediğiniz yere koyabilirsiniz.

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

AllActive için başka bir yaygın kullanım, öğelerinizin bulunduğu bir listedir. Ancak öğeler aktivasyon gerektiren kendi View/ViewModel'lerine sahip olmayı gerektirecek kadar karmaşıktır. Bu durumda, x:Name liste denetimini Items olarak ayarlayacağınız için görünümler için ayrı özelliklere sahip olmanız gerekmeyecektir.

0
Sen TabViewModel yerinde TreeViewModel kullanın aşağıda gibi uygularım olabilir

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

ShellView nasıl görünüyor? – EngineerSpock

+0

Benim yanıtım güncelleştirildi –

+0

Bu yalnızca TabControl için çalışır? – EngineerSpock