2009-05-25 9 views
0

J'ai un ModelView avec plusieurs ObservableCollection. Est-ce la bonne approche et aussi quand la vue appelle le modle de vue, tous les ObservableCollection doivent être ranimés avec des données et ensuite la liaison a lieu à nouveau pour toute la CollectionViewSource.Comment lier une vue avec plusieurs ObservableCollection

Aussi comment j'appelle CollectionViewSource.GetDefaultView en dehors du constructeur du viewmodel, j'obtiens une erreur qu'il peut seulement être appelé dans le construtor.

Si je crée un ModelView séparé pour chaque CollectionViewSource, alors lors de la liaison de l'une des vues avec ModelView, le reste des contrôles est également associé cette fois avec des valeurs null et tous les ModelView ne sont pas appelés.

Je suis vraiment confus ce qu'il faut faire, s'il vous plaît aider.

Répondre

0

Il semble que vous utilisiez MVVM. Vous pouvez certainement lier plusieurs ObservableCollections. La question est vraiment: avez-vous besoin de? Vous devez réserver la liaison à ObserableCollections pour les cas où votre ViewModel est en train de changer et vous devez garder votre vue à jour avec les modifications.

Voici un exemple pour lequel j'ai créé une vue liée à deux ObservableCollections et une List dans un ViewModel. Alors - oui - vous pouvez certainement vous lier à ce que vous voulez. Dans cet exemple, les deux ObservableCollections alterneront les mises à jour. Est ce que ça aide?

J'ai posté le code pour ce here si ça aide d'avoir le projet entier vs.

Vue:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel Orientation="Vertical"> 

     <TextBlock>Bind to List:</TextBlock> 
     <ListView ItemsSource="{Binding Path=Users}" Height="20"/> 

     <TextBlock>Bind to ObservableCollection1:</TextBlock> 
     <ListView ItemsSource="{Binding Path=ObservableCollection1}" 
       Height="100"/> 

     <TextBlock>Bind to ObservableCollection2:</TextBlock> 
     <ListView ItemsSource="{Binding Path=ObservableCollection2}" 
       Height="100"/> 

    </StackPanel> 
</Window> 

ViewModel (Voir est lié à cette ViewModel)

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Timers; 
using System.Windows; 
using System.Windows.Threading; 
namespace WpfApplication1 
{ 
    public class Class1 
    { 
    public List<string> Users{get;set;} 
    public ObservableCollection<string> ObservableCollection1 { get; set; } 
    public ObservableCollection<string> ObservableCollection2 { get; set; } 
    public Class1() 
    { 
     this.Users = new List<string>{ "bob", "mary" }; 

     this.ObservableCollection1 = new ObservableCollection<string>(); 
     this.ObservableCollection2 = new ObservableCollection<string>(); 
     int counter = 0; 
     Timer t1 = new Timer(); 
     t1.Enabled = true; 
     t1.Interval = 1000; 
     t1.Elapsed += delegate 
     { 
     Application.Current.Dispatcher.Invoke(
     DispatcherPriority.Send, new Action(delegate 
     { 
      if(counter % 2 == 1) 
      this.ObservableCollection1.Add(DateTime.Now.ToString()); 
      else 
      this.ObservableCollection2.Add(DateTime.Now.ToString()); 
      ++counter; 
     })); 
     }; 
    } 
    } 
} 
Questions connexes