Привязка данных Windows Phone в Silverlight - нубский вопрос - PullRequest
1 голос
/ 30 июля 2010

У меня есть базовое приложение Windows Phone List, с кодом, подобным этому, в классе MainViewModel

// CODE THAT WORKS --

Items.Clear();

foreach (var itm in e.Result)
    Items.Add(itm);

Count = Items.Count;

// CODE THAT DOES NOT WORK -- I'm trying to understand WHY

Items = e.Result;

Xaml с привязкой данных выглядит так:

<DataTemplate>
    <StackPanel x:Name="DataTemplateStackPanel" Orientation="Horizontal">
        <Image x:Name="ItemImage" Source="/AppName;component/Images/ArrowImg.png" Height="43" Width="43" VerticalAlignment="Top" Margin="10,0,20,0"/>
        <StackPanel>
            <TextBlock x:Name="ItemText" Text="Event Name" Margin="-2,-13,0,0" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
            <TextBlock x:Name="DetailsText" Text="{Binding Path=Description}" Margin="0,-6,0,3" Style="{StaticResource PhoneTextSubtleStyle}"/>
        </StackPanel>
    </StackPanel>
</DataTemplate>

Я думаю, что у меня естьнепонимание того, как ObservableCollection и INotifyPropertyChanged работают, потому что я думаю, что этот код должен работать.Привязка данных к элементам NonCollection работает, как и следовало ожидать с моей реализацией INotifyPropertyChanged.

1 Ответ

5 голосов
/ 30 июля 2010

Хотя вы не включили фрагмент кода для свойства Items, я думаю, проблема в том, что вы не запускаете событие PropertyChanged при изменении значения свойства (то есть при изменении ссылки на другой объект),Если вы хотите сохранить код, который не работает, вы должны реализовать свойство Items следующим образом:

private IEnumerable<Item> items;

public IEnumerable<Item> Items
  {
      get { return this.items; }
      set
      {
          this.items = value;
          // Call OnPropertyChanged whenever the property is updated
          OnPropertyChanged("Items");
      }
  }

  protected void OnPropertyChanged(string name)
  {
      PropertyChangedEventHandler handler = PropertyChanged;
      if (handler != null)
      {
          handler(this, new PropertyChangedEventArgs(name));
      }
  }

В этой реализации вам не нужно, чтобы коллекция Items была ObservableCollection, но каждыйесли вы захотите изменить его (добавить или удалить элементы), вы должны заменить его полностью.

Конечно, вы можете оставить тип как ObservableCollection вместо IEnumerable, но учтите накладные расходы, которые этот тип коллекции имеет над другими, такими как List или Array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...