WPF Observablecollection основной сценарий детализации - PullRequest
2 голосов
/ 07 января 2010

любая помощь с этим была бы великолепна.

У меня есть модель

public class Master
{
   ...
   public Detail[] Details {get; set;}
}

Я заполняю свою модель представления из службы WCF, которая возвращает мою коллекцию главных объектов. Я настроил ссылку на службу так, чтобы она возвращала observablecollection, чтобы я мог легко использовать ее в моей модели представления.

Моя модель просмотра тогда имеет

public ObservableCollection<Master> Masters {get; set;}
public Master SelectedMaster {get; set;}

На мой взгляд, у меня есть 2 списка: один привязан к моему свойству Masters, а другой - к SelectedMaster.Details.

Это все отлично работает, кроме того, когда я добавляю, попробуйте добавить новую деталь в SelectedMaster.

Коллекция Details в SelectedMaster - это просто список Details (не ObservableCollection), что и понятно.

Какие варианты у меня здесь? Я попытался реализовать INotifyPropertyChanged, но это не похоже на работу. У меня может быть другая ObservableCollection для Details, но это означает, что я должен сохранять эту коллекцию синхронизированной при изменении SelectedMaster (свойство SelectedMaster привязано к SelectedItem в моем первом списке).

Надеюсь, с этим все в порядке. Очень хотелось бы получить некоторые отзывы. Было бы идеально, если бы WCF мог просто возвращать коллекцию деталей как наблюдаемую коллекцию, как это происходит с коллекцией Мастеров, но, похоже, это не работает так.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 07 января 2010

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

Здесь нет магии, простой массив не реализует никаких уведомлений об изменениях; вам просто нужно обернуть его в какую-нибудь коллекцию, учитывающую представление, например ObservableCollection.

Оберните все и взаимодействуйте только с упакованными коллекциями, пример:

public class MasterWrapper
{
...
    public MasterWrapper(Master master)
    {
        this.Details = new ObservableCollection<Detail>();
        this.Master = master;
        foreach (var detail in Master.Details)
            this.Details.Add(detail);
    }
...

    public static ObservableCollection<MasterWrapper> GetMasters()
    {
        ObservableCollection<MasterWrapper> results = 
            new ObservableCollection<MasterWrapper>();
        List<Master> modelMasters = null; // Populate this from the service.
        foreach (var m in modelMasters)
            results.Add(new MasterWrapper(m));
        return results;
    }
1 голос
/ 07 января 2010

Вы правы в том, что проблема в том, что свойство Details не имеет уведомлений об изменениях, возвращаемых обратно в представление, поскольку это просто массив объектов Detail ...

Я бы сделал это ObservableCollection<Detail> и загрузил бы коллекцию в конструкторе Master, как ...

public Master(Detail[] details)
{
    Details = new ObservableCollection<Detail>(details);
}

помните, что ObservableCollection<T> принимает IEnumerable<T> или List<T> в качестве параметра в своем конструкторе.

...