2009-05-25 7 views
0

Ich habe eine ModelView mit mehreren ObservableCollection. Ist dies der richtige Ansatz und auch wenn View das View-Modell aufruft, müssen alle ObservableCollection-Daten erneut mit Daten gefüllt werden, und dann findet die Bindung für die gesamte CollectionViewSource erneut statt.So binden Sie eine Ansicht mit mehreren ObservableCollection

Auch wie ich CollectionViewSource.GetDefaultView außerhalb des Konstruktors des Viewmodel aufrufen, bekomme ich einen Fehler, dass es nur im Konstruktor aufgerufen werden kann.

Wenn ich eine separate ModelView für jede der CollectionViewSource erstellen, wird beim Binden einer der Ansicht mit ModelView, Rest der Steuerelemente auch Bindh dieses Mal mit Nullwerten und alle die ModelView wird nicht aufgerufen.

Ich bin wirklich verwirrt, was zu tun ist, bitte helfen.

Antwort

0

Es klingt wie Sie MVVM verwenden. Sie können sicher an mehrere ObservableCollections binden. Die Frage ist wirklich: brauchst du? Sie sollten eine verbindliche Reservierung für ObserableCollections für Fälle vornehmen, in denen sich Ihr ViewModel ändert und Sie Ihre View mit den Änderungen aktualisieren müssen.

Hier ist ein Beispiel für eine Ansicht, die an zwei ObservableCollections und eine Liste in einem ViewModel gebunden ist. Also - ja - du kannst sicher an alles binden, was du willst. In diesem Beispiel werden die beiden ObservableCollections abwechselnd aktualisiert. Hilft das?

Ich habe den Code für diese here veröffentlicht, wenn es hilft, das gesamte vs-Projekt zu haben.

Ausblick:

<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 (Blick auf dieses Ansichtsmodell gebunden ist)

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