2

Я относительно новичок в опыте Silverlight и пытаюсь создать приложение MVVM с DomainService, которое возвращает POCOs в качестве моделей. У меня есть UserControl, у которого есть TreeView с набором ItemsSource для привязки к ObservableCollection типа, который имеет ObservableCollection как одно из его свойств, и эта коллекция имеет тип, который имеет свойство ObservableCollection. Поэтому я использую HierarchicalDataTemplate как ItemTemplate TreeView с TextBlocks, чтобы отобразить свойство Name каждого элемента. Ниже я расскажу о некотором коде.ObservableCollection with ObservableCollections не корректно отображает

Так что классы были бы что-то вроде этого:

public class A 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public ObservableCollection<B> Bs { get; set; } 
} 

public class B 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public ObservableCollection<C> Cs { get; set; } 
} 

public class C 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

В основном, мои коллекции становятся заселены из DataRepository с помощью метода, который получает списки A, B и C. добавляет каждый экземпляр надлежащим образом с помощью LINQ через петли foreach. И возвращает список. Метод работает правильно, как я его вызвал из default.aspx.cs и сделал шаг, чтобы подтвердить, что все данные правильно добавлены.

Но моя проблема в том, что когда она отображается на экране, ни одна из коллекций не верна. Например, первый элемент дочерней коллекции «A» в «B» должен иметь счет более 4000, и все же ни один из них не показан. И тем не менее, первый элемент «B», который должен находиться в коллекции «Bs» первого «A», показан для второго элемента «A».

(пример того, что оно должно быть)

  • a1

    • B1.1
      • c1.1.1
      • c1.1.2
      • c1.1.3
    • B1.2
      • c1.2.1
      • c1.2.2
  • a2

    • B2.4
      • c2.4.1
      • c2. 4.2
      • c2.4.3
  • а3

    • B3.6
      • c3.6.1
      • c3.6.2
      • c3.6.3
  • а4

    • b4.8
      • c4.8.1
      • c4.8.2
      • c4.8.3

(пример того, что он показывает)

  • a1
  • а2
    • B2.2
      • c2.2.2
  • а3
  • а4
    • b4.4
      • c4.4.4

После некоторого исследования, единственный образец, который я вижу в том, что иерархия основана на идентификаторы будучи то же самое.

Вот примеры кода:

(DataContext устанавливается в UserControl ресурсов)

<sdk:TreeView ItemsSource="{Binding Path=As}" > 
<sdk:TreeView.ItemTemplate>` 
    <sdk:HierarchicalDataTemplate ItemsSource="{Binding Path=Bs}"> 
    <TextBlock Text="{Binding Path=Name}" /> 
    <sdk:HierarchicalDataTemplate.ItemTemplate> 
    <sdk:HierarchicalDataTemplate ItemsSource="{Binding Path=Cs}"> 
    <TextBlock Text="{Binding Path=Name}" /> 
    <sdk:HierarchicalDataTemplate.ItemTemplate> 
     <sdk:HierarchicalDataTemplate ItemsSource="{Binding}"> 
     <TextBlock Text="{Binding Path=Name}" /> 
     </sdk:HierarchicalDataTemplate> 
    </sdk:HierarchicalDataTemplate.ItemTemplate> 
    </sdk:HierarchicalDataTemplate> 
    </sdk:HierarchicalDataTemplate.ItemTemplate> 
    </sdk:HierarchicalDataTemplate> 
</sdk:TreeView.ItemTemplate> 
</sdk:TreeView> 

ViewModel

public class myViewModel 
{ 
    private myDomainContext context = new myDomainContext(); 

    public ObservableCollection<A> As 
    { 
     get 
     { 
      LoadOperation<A> loadOp = context.Load(context.GetAsQuery()); 
      return new ObservableCollection<A>(loadOp.Entities); 
     } 
    } 
} 

Я извиняюсь о длине этого вопроса, Я надеялся не быть таким расплывчатым и получить полезные советы. Этот вопрос преследует меня в течение нескольких дней, и я готов к продолжению. Пожалуйста, помогите мне выбраться из гадости. Спасибо заранее. И если у вас есть хорошие ссылки, которые были бы полезны для моих знаний MVVM, я был бы очень благодарен им.

Мой Окружающая среда: - Asp.Net 4 - Silverlight 4 - VisualStudio 2010

+0

Спасибо, кто когда-либо добавлял отступ в xaml. – jhorton

ответ

1

Я был под впечатлением, что HierarchicalDataTemplate используется иерархически :) То есть, вы используете один только и он рекурсивно применяется к любым детям.

Это означает, что ключи данных должны быть связаны и данные равномерные (одного и того же типа).

Шаблон, который вы описали выше, представляет собой, в основном, 3 шаблона внутри друг друга, поэтому вы получаете первую запись каждого отображаемого (где есть дочерние данные).

+0

В последнее время я заметил, что вы можете что-то сказать. Я начинаю читать об элементах ItemTemplateSelectors, которые могут иметь какое-то отношение к тому, чтобы получить меня от этого. – jhorton

+0

После нескольких дней изучения моей проблемы я обнаружил, что мои данные/коллекции были правильно заполнены на сервере. Но после того, как DomainService был вызван и LoadOperation DomainContext завершил загрузку, я обнаружил, что коллекции были неправильными. И именно поэтому ничего не было правильно. Поэтому я начну новый поток с просьбой о помощи по этому вопросу. Я отметил это как ответ, потому что это была настоящая правда. Я неправильно использовал HierarchicalDataTemplate. Так что спасибо вам за помощь. Счастливы все кодировки. – jhorton

0

Я думаю, что одна вещь, которую вы должны обязательно рассмотреть, - это сделать объекты реализацией INotifyPropertyChanged. Смотрите в этом примере http://snipplr.com/view/13639/viewmodelbase-class/

В этом случае вы должны изменить свойства немного

private int _id; 

public int Id 
{ 
    get { return _id;} 
    set { _id = value; NotifyChanged("Id");} 
} 

Он не должен быть внутри собственности. Когда вы обновляете дочернюю коллекцию, например, Bs, вы можете позвонить NotifyChanged («Bs»)

Это будет означать, что свойство было обновлено.

+0

re * NotifyChanged ("Bs") *: Если список Bs фактически не заменен сам, ObservableCollection уже отправляет уведомления об изменениях для своих собственных изменений содержимого. –

+0

Это правильно, но вы должны знать, действительно ли вы генерируете ObservableCollection из списка, Queryable или Enumerable. –

+0

Не звучать неблагодарно для ваших комментариев, но я думаю, вы, ребята, упустили контекст вопроса. В основном ответ заключается в том, что иерархический шаблон должен использовать тот же тип данных, где я хотел отображать дерево с тремя типами данных. Поэтому мое решение состоит в том, что я создаю HierarchicalTreeView, который будет добавлять новые элементы на основе коллекций, найденных в коллекции исходных предметов. Я также вложу свои классы здесь, если кто-то еще столкнется с этой ситуацией. Плюс я хотел бы получить некоторую обратную связь по классам, если это возможно. Еще раз спасибо за комментарии. – jhorton

Смежные вопросы