2010-02-09 75 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

相關問題