2009-05-25 1 views
0

У меня есть ModelView с несколькими ObservableCollection. Правильно ли это, и когда когда-либо просматривается вызов режима просмотра, все ObservableCollection необходимо повторно заполнить данными, а затем привязка снова будет выполнена для всего CollectionViewSource.Как связать представление с несколькими ObservableCollection

Также как я могу вызвать CollectionViewSource.GetDefaultView вне конструктора viewmodel, я получаю сообщение об ошибке, которое он может вызывать только в конструкторе.

Если я создаю отдельный ModelView для каждого из CollectionViewSource, то при привязке одного из представлений с ModelView остальные элементы управления также будут привязаны на этот раз с нулевыми значениями, и все модели ModelView не будут вызваны.

Я действительно смущен, что делать, пожалуйста, помогите.

ответ

0

Похоже, вы используете MVVM. Вы можете привязываться к нескольким ObservableCollections. На самом деле вопрос: вам нужно? Вы должны зарезервировать привязку к ObserableCollections для случаев, когда ваша ViewModel изменяется, и вам необходимо сохранить обновленный вид View с изменениями.

Вот пример, который я взломал для вас представление, связанное с двумя ObservableCollections и одним списком в ViewModel. Итак - да - вы можете привязываться ко всему, что хотите. В этом примере два ObservableCollections будут чередовать обновление. Это помогает?

Я разместил код для этого here, если он помогает иметь весь проект.

Вид:

<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 (Посмотреть связан с этой 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; 
     })); 
     }; 
    } 
    } 
} 
Смежные вопросы