Silverlight: как привязать List <T>к сетке данных - PullRequest
1 голос
/ 14 августа 2010

Шаблон MVVM реализован в моем приложении Silverlight4.

Изначально я работал с ObservableCollection объектов в моей ViewModel:

public class SquadViewModel : ViewModelBase<ISquadModel>
{
    public SquadViewModel(...) : base(...)
    {
        SquadPlayers = new ObservableCollection<SquadPlayerViewModel>();
        ...
        _model.DataReceivedEvent += _model_DataReceivedEvent;
        _model.RequestData(...);
    }

    private void _model_DataReceivedEvent(ObservableCollection<TeamPlayerData> allReadyPlayers, ...)
    {
        foreach (TeamPlayerData tpd in allReadyPlayers)
        {
            SquadPlayerViewModel sp = new SquadPlayerViewModel(...);
            SquadPlayers.Add(sp);
        }
    }
    ...
}

Вот код XAML для отображения сетки:

xmlns:DataControls="clr-namespace:System.Windows.Controls;
                    assembly=System.Windows.Controls.Data"
...
<DataControls:DataGrid ItemsSource="{Binding SquadPlayers}">
    ...</DataControls:DataGrid>

и моя ViewModelсвязан со свойством DataContext представления.

Эта коллекция (SquadPlayers) не изменяется после ее создания, поэтому я хотел бы изменить ее тип на

List<SquadPlayerViewModel>

.Когда я это сделал, я также добавил

RaisePropertyChanged("SquadPlayers")

в конце метода _model_DataReceivedEvent (чтобы уведомить сетку об изменении данных списка.

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

Вопрос 1. Почему в таблице данных изначально нет элементов?Q2: Как сделать так, чтобы они отображались автоматически?

Спасибо.

PS Вот объявление нового объекта List в моей модели представления:

        public List<SquadPlayerViewModel> SquadPlayers { get; set; }

Ответы [ 3 ]

3 голосов
/ 24 августа 2010

Вы не можете использовать List в качестве источника привязки, потому что List не реализует INotifyCollectionChanged, для WPF / Silverlight требуется знание того, изменяется ли содержимое коллекции или нет.WPF / Sivlerlight, чем может предпринять дальнейшие действия.

Я не знаю, зачем вам нужен List <> в вашей модели представления, но если по причине абстракции вы можете использовать IList <>.но убедитесь, что вы поместили в него экземпляр ObservableCollection <>, а не List <>.Независимо от того, какой тип вы использовали в привязке ViewModel Только заботятся о типе времени выполнения.

, поэтому ваш код должен выглядеть следующим образом:

//Your declaration
public IList<SquadPlayerViewModel> SquadPlayers { get; set; }
//in your implementation for WPF/Silverlight you should do
SquadPlayers = new ObservableCollection<SquadPlayerViewModel>();
//but for other reason (for non WPF binding) you can do
SquadPlayers = new List<SquadPlayerViewModel>();

Обычно я использовал этот подход для абстрагирования моего домена «Proxied»Модель, возвращенная NHibernate.

2 голосов
/ 15 августа 2010

Вам нужно, чтобы ваш список SquadPlayers был определен примерно так:

<br>
    private ObservableCollection<SquadPlayerViewModel> _SquadPlayers;</p>

<pre><code>    public ObservableCollection<SquadPlayerViewModel> SquadPlayers
    {
        get
        {
            return _SquadPlayers;
        }

        set
        {
            if (_SquadPlayers== value)
            {
                return;
            }

            _SquadPlayers= value;

            // Update bindings, no broadcast
            RaisePropertyChanged("SquadPlayers");
        }
    }

1 голос
/ 14 августа 2010

Проблема в том, что, хотя событие PropertyChanged сообщает о привязке «изменения», значение на самом деле не изменилось, объект коллекции остается тем же объектом.Некоторые элементы управления сохраняют себе некоторую выполненную ненужную работу, если считают, что значение на самом деле не изменилось.

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

...