Как связать представление с несколькими ObservableCollection - PullRequest
0 голосов
/ 25 мая 2009

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

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

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

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

1 Ответ

0 голосов
/ 25 мая 2009

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

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

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

Вид:

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