ItemsControl MVVM Binding - PullRequest
       7

ItemsControl MVVM Binding

2 голосов
/ 09 февраля 2010

У меня есть форма, которая привязывается к ViewModel (MVVM). Внутри формы у меня есть ItemsControl, который связан с элементом с именем projects в моем DataContext.

Когда я выполняю сохранение с использованием шаблона команды, я сохраняю элемент и выполняю извлечение, а затем хочу повторно привязать ItemsControl к коллекции Projects. Эта часть, похоже, не работает, все мои сервисные вызовы работают должным образом, но мое представление не связано с новой коллекцией с добавленным элементом, даже если она возвращается с сервера.

Любая помощь с этим действительно будет оценена.

XAML

<ItemsControl Name="ProjectGrid" 
      Background="Transparent" ItemsSource="{Binding Path=Projects}" Margin="0,0,0,0" VerticalAlignment="Top"
      ItemContainerStyle="{StaticResource alternatingWithTriggers}" 
      AlternationCount="2" 
      ItemTemplate="{StaticResource ItemTemplate}"/>

ViewModel

    public ICommand SaveCommand
    {
        get
        {
            if (_cmdSave == null)
            {
                _cmdSave = new RelayCommand(Save, CanSave);
            }

            return _cmdSave;
        }
    }

    public void Save()
    {
         MyService.Save();
         PopulateModel();
    }

    private void PopulateModel()
    {
        Projects = MyService.GetProjects();
    }

    public ProjectDto[] Projects
    {
        get { return _projects; }
        set
        {
            if (_projects == value)
                return;

            _projects = value;

            Notify(PropertyChanged, o => Projects);
        }
    }

Ответы [ 2 ]

3 голосов
/ 09 февраля 2010

Убедитесь, что ваша ViewModel реализует INotifyPropertyChanged. Ваш пользовательский интерфейс не будет знать об изменении, если ваша модель представления не сообщит об этом при изменении свойства

используйте конвертер отладки, чтобы убедиться, что ваша привязка не работает. Вот пример здесь того, как это сделать. Это метод, который нужен каждому разработчику wpf.

Я почти уверен, что ваш NotifyPropertyChanged не работает, конвертер отладки скажет вам наверняка

1 голос
/ 09 февраля 2010

Как уже сказал Аран Малхолланд, внедрите INotifyPropertyChanged в своей ViewModel. Кроме того, попробуйте использовать ObservableCollection для своих коллекций.
И вместо сброса коллекции попробуйте использовать

Projects.Clear();
MyService.GetProjects().ToList().ForEach(Projects.Add);

И в качестве подсказки попробуйте сделать метод GetProjects () асинхронным, чтобы он не блокировал пользовательский интерфейс ...

...