2010-02-09 48 views
2

我有一个窗体绑定到ViewModel(MVVM)。在窗体内部,我有一个ItemsControl,它绑定到名为DataContext中的项目的元素。ItemsControl MVVM Binding

当我使用命令模式进行保存时,我保存该项目并执行检索,然后我想将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}"/> 

视图模型

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); 
     } 
    } 
+0

什么Notify方法有用吗?如果你正在实现INotifyPropertyChanged更改通知,我认为WPF期望处理程序被称为像PropertyChanged(这,“项目”); – jeffora 2010-02-09 00:40:21

+0

我会仔细检查,但我确信我正在这样做。 – Burt 2010-02-09 01:04:37

+0

@jeffora:这就是'Notify(PropertyChanged,o => Projects)'的作用。许多人正在切换到接受lambda表达式的helper方法,以避免使用字符串文字。 – 2010-02-09 18:45:51

回答

1

正如阿兰穆赫兰已经说过,在你的视图模型执行INotifyPropertyChanged。 另外,尝试为您的集合使用ObservableCollection。和
而不是重新集合时,尽量使用

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

而只是作为一个提示,尽量使GetProjects()方法异步,所以它不会阻止用户界面...

+0

Observable收集完成的伎俩感谢罗尔 – Burt 2010-02-09 20:41:10

3

确保您的视图模型正在实施INotifyPropertyChanged的。如果您的视图模型在属性更改时不通知它,则您的用户不会知道更改

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

Im相当肯定是你的NotifyPropertyChanged即出现故障,调试器会告诉你某些

+1

+1为调试转换器链接,这就是一些好东西(TM) – 2010-02-09 03:43:56

+1

每个项目,第一项 - 调试转换器 – 2010-02-09 04:23:00

相关问题