2013-08-06 4 views
2

데이터가 DataGrid 인 행이 Resources<ResourceViewModel> 인 MVVM 앱이 있습니다. 나는이 작동DataGrid 추가 된 행은 업데이트했지만 추가 된 열은 업데이트하지 않습니다.

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

를 통해 DataGrid에 표시된 리소스 데이터에위한 추가적인 자원/행을 추가합니다. 그러나, 나는 정확히 같은 접근 방식을하고 이벤트 인수가 업데이트 된 기본 Resource의를 개최 곳

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에 열을 추가하려고. 이제 데이터를 검사했는데 올바른 것입니다. 열이 추가되고 있지만 DataGrid에 새 열이 표시되지 않습니다. 내가 뭘 잘못하고 있니?

+0

, 그것은 도움 여부 만 설정하려고합니다'AutoGenerateColumns'= "참". –

+0

나는 그리드에 특별한 바인딩을 사용하고 있는데, 이는 '수동으로'열을 만들어야한다는 것을 의미한다. 시간 내 줘서 고마워. – MoonKnight

+0

@Killercam, 이것은 단지 나에게 발생했다. 당신이'OnResourceCultureCollectionChanged'에서 Resources를 null로 설정하려고 시도한 다음, 새로운 목록을 만든 다음'Add (rvm)'? 그것이 ItemSource를 재설정하고 DataGrid를 다시 그리도록 강요하는지 궁금합니다. 나는 의심의 여지가 있지만 시도해 볼만한 가치가있다 ... –

답변

1

데이터 격자를 다시 칠할 필요가있는 열을 추가 할 때 DataGrid.ItemSource을 재설정해야합니다.

보기 :

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

관련 문제