ItemsControl MVVM绑定

时间:2010-02-09 00:22:41

标签: wpf silverlight data-binding

我有一个绑定到ViewModel(MVVM)的表单。在表单内部,我有一个ItemsControl,它绑定到我的DataContext中名为projects的元素。

当我使用命令模式进行保存时,我保存项目并进行检索,然后我想将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 个答案:

答案 0 :(得分:3)

确保您的ViewModel正在实施INotifyPropertyChanged。如果您的视图模型在属性更改时没有通知,您的ui将不会知道更改

使用调试转换器确定绑定是否失败。有一个例子here如何做到这一点。这是每个wpf开发人员都需要的技术。

我非常确定你的NotifyPropertyChanged失败了,调试转换器会告诉你某些

答案 1 :(得分:1)

正如Aran Mulholland已经说过,在ViewModel中实现INotifyPropertyChanged。 另外,尝试为集合使用ObservableCollection 而不是重置集合,尝试使用

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

就像提示一样,尝试使GetProjects()方法异步,因此它不会阻止UI ......