2013-08-06 92 views
2

我有一個綁定到Resources<ResourceViewModel>的數據綁定DataGrid的MVVM應用程序。我通過DataGrid正在更新添加行但不添加列

private void OnResourceAddedToCollection(object sender, ResourceCollectionChangedEventArgs e) 
{ 
    var viewModel = new ResourceViewModel(e.NewResource); 
    Resources.Add(viewModel); 
} 

該作品增添產生額外的資源/行於DataGrid所示的資源數據。不過,我採取完全一樣的方法,並嘗試通過

private void OnResourceCultureCollectionChanged(object sender, 
    ResourceCulturesCollectionChangedEventArgs e) 
{ 
    Resources.Clear(); 
    foreach (var rvm in e.NewResourceCollection.Select(r => new ResourceViewModel(r)).ToList()) 
     Resources.Add(rvm); 
} 

添加到DataGrid列在事件參數保持更新底層Resource秒。現在我已經檢查了數據,它是正確的 - 正在添加列,但DataGrid未顯示新列。 我在做什麼錯?

+0

我不知道,這將有助於與否,而是嘗試設置'的AutoGenerateColumns = 「真」'。 –

+0

我不能,我正在使用一個特殊的綁定到網格,這意味着我必須手動創建列。謝謝你的時間。 – MoonKnight

+0

@Killercam,這只是發生在我身上,你有沒有嘗試在你的'OnResourceCultureCollectionChanged'設置資源爲空,然後創建一個新的列表,然後'添加(rvm)'?想知道是否會重置ItemSource並強制datagrid重繪。我懷疑,但值得一試... –

回答

1

添加列時,您需要重新繪製數據網格,重置您的DataGrid.ItemSource應該這樣做。

VIEW:

public SomeView(IViewModel vm) 
{ 
    ViewModel = vm; 
    DataContext = ViewModel; 

    InitializeComponent(); 

    ViewModel.PropertyChanged += (s, e) => 
    { 
     switch (e.PropertyName) 
     { 
      case "IsResetingColumns": 
       if (!ViewModel.IsResetingColumns) 
       { 
        dataGrid.ItemsSource = null; 
        dataGrid.ItemsSource = ViewModel.Resources; 
       } 
       break; 
      } 
     }; 
    } 

視圖模型:

public class ViewModel : INotifyPropertyChanged 
{ 
    private bool _isResetingColumns; 

    public bool IsResetingColumns 
    { 
     get 
     { 
      return _isResetingColumns; 
     } 
     set 
     { 
      if (_isResetingColumns == value) 
       return; 
      _isResetingColumns = value; 
      OnPropertyChanged("IsResetingColumns"); 
     } 
    } 

    private void OnResourceCultureCollectionChanged(object sender, 
                ResourceCulturesCollectionChangedEventArgs e) 
    { 
     //VIEWMODEL IS SETTING THIS TO TRUE BEFORE RESETTING `RESOURCES` 
     IsResetingColumns = true; 

     Resources.Clear(); 
     foreach (var rvm in e.NewResourceCollection.Select(r => new ResourceViewModel(r)).ToList()) 
      Resources.Add(rvm); 

     //VIEW'S LISTENING TO THIS PROPERTY CHANGED (naming could be better, or an event ,but the gist is there) 
     IsResetingColumns = false; 
    } 
+0

不,我不能這樣做。這是一個MVVM應用程序 - 我無法直接訪問DataGrid(儘管我非常想要!)。謝謝你的幫助。 – MoonKnight

+0

那麼爲什麼不在ViewModel中添加一個事件,然後在View上監聽該事件並更新'View.DataGrid.ItemsSource'呢? –

+0

因爲它會打破MVVM模式! – MoonKnight