2012-06-26 2 views
0

에서 (같은 종류의) ObservableCollection에에 뷰 모델에서 동기화 ObservableCollection에 나는 현재 모델 객체의 몇 가지있다 뷰 - 모델, I는 같은 관찰 컬렉션이 있습니다 내 응용 프로그램 컨트롤러에서 다음는 모델

private ObservableCollection<ModelBaseClass> modelBaseClasses; 
public ObservableCollection<ModelBaseClass> ModelBaseClasses 
{ 
    get{ return modelBaseClasses ?? (modelBaseClasses = new ObservableCollection<ModelBaseClass>()); } 
    set 
    { 
     modelBaseClasses = value;     
     OnPropertyChanged(new PropertyChangedEventArgs("ModelBaseClasses")); 
    } 
}  

private ObservableCollection<ModelCollectionClass> modelCollectionClasses; 
public ObservableCollection<ModelCollectionClass> ModelCollectionClasses 
{ 
     get { return modelCollectionClasses ?? (modelCollectionClasses = new ObservableCollection<ModelCollectionClass>()); } 
     set 
     { 
      modelCollectionClasses = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("ModelCollectionClasses"));     
     } 
}  

(대표 뷰 - 모델 일), 나는 다음과 같은 ModelBaseClass 수집을로드 더미 방법이 있습니다

내가 가질 수 있도록이 방법 루프에 대한 하나 이상이 있음을 주목해야한다
for (int i = 0; i < 8; i++) 
{ 
    myViewModel.ModelBaseClasses.Add(new ModelBaseClass() 
    { 
     DateTimeProperty = Convert.ToDateTime("06/2" + i + "/2012 09:00:00 AM") 
     //Other properties get set as well, using the i variable... 
    } 
} 

함께 할만한 많은 데이터. 더 복잡한 점점 시작되는이 지금

myViewModel.ModelBaseClasses 
       .GroupBy(modelBaseClass => ((DateTime)modelBaseClass.DateTimeProperty).Date) 
       .Select(group => group.ToList()) 
       .ToList() 
       .ForEach(
        list => myiewModel.ModelBaseCollections.Add(new ModelBaseCollection() { ModelBaseClasses = new ObservableCollection<ModelBaseClass>(list) }) 
       ); 

:

다음, 나는 다음과 같은 날짜에 의해 객체와 그룹을의 큰 컬렉션을 소요하는 방법이있다. 내보기의 XAML에서는 ItemsSource를 내 View-Model의 ModelCollectionClasses 속성에 바인딩 된 ItemsSource로 선언했습니다. 그것은 다음과 같습니다

<DataTemplate x:Key="ItemsTemplate"> 
    <Grid DataContext="{Binding ModelBaseClasses}">    

     <DataGrid AutoGenerateColumns="False" 
        HeadersVisibility="None" 
        CanUserAddRows="False" 
        CanUserDeleteRows="False" 
        ItemsSource="{Binding Path=DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}}" 
        SelectedItem="{Binding Path=DataContext.SelectedModelBaseClass, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type views:MyView}}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">     

      <DataGrid.Columns>           
        ...Omitted for brevity... 
      </DataGrid.Columns> 
     </DataGrid>    
    </Grid> 
</DataTemplate> 

을 이제 상기, 내가지고있어 모두와 함께이 특정 뷰에 대한 리소스 사전에 그런

<ItemsControl ItemsSource="{Binding Path=DataContext.ModelCollectionClasses, RelativeSource={RelativeSource AncestorType={x:Type views:MyView}}}" 
           ItemTemplate="{StaticResource ItemsTemplate}">      
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Width="{Binding ElementName=scroller, Path=ViewportWidth}"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

, 나는 다음과 같은 DataTemplate을 선언해야 내가 처음에 원했던 데이터의 시각적 표현 그러나 지금 실행중인 문제는 ModelBaseClass 객체 중 하나를 삭제하려고 할 때입니다. DataGrid의 ItemsSource가 내 뷰 모델의 ModelBaseClasses가 아닌 ModelCollectionClass의 ModelBaseClasses 속성에 바인딩되기 때문에 ModelBaseClass를 내 뷰 모델에있는 ModelCollectionClass에서 제거하면 어떻게 든 ModelCollectionClass를 알릴 필요가 있습니다. 이 변경 사항은 UI가 제대로 업데이트되도록합니다.

일부 사람들이 모델 컬렉션과 뷰 모델 컬렉션을 동기화하는 래퍼 클래스를 만든 몇 가지 다른 예를 보았지만 내 자신의 응용 프로그램에서 그런 것을 구현하는 데 어려움을 겪고 있습니다. 모든 통찰력 또는 도움이되는 힌트/아이디어는 크게 평가 될 것입니다.

+1

누군가가 당신을 위해이 큰 코드를 파싱 할 확신합니까? 간결하게하려고하십시오. – RredCat

+0

코드가 상당히 깔끔하다는 것을 알고 있지만 최대한 투명하게하려고 노력 중입니다. 그러나 주셔서 감사합니다. – dgsmith15

+0

ModelBaseClass를 삭제하는 방법을 살펴 보는 것이 흥미로울 것입니다.하지만 바로 그럴 경우 ModelBaseClass 및 ModelCollectionClass에 대한 NotifyPropertyChanged를 올려야합니다. – BigL

답변

0

솔직히 질문이 너무 복잡해서 내가하고 싶은 것을 얻지 못한다. 하지만 귀하의 코드에서 한 가지만 발견했습니다. ModelCollectionClass에서 ModelBaseClasses (es)을 설정했음을 알리고 ModelBaseClass 속성을 설정했습니다. 도움이되는지 확신하지 못합니다.

+0

그건 오타였습니다. 요약하자면 ModelCollectionClass는 ModelBaseClasses라고하는 OC 를 갖습니다. MyViewModel에는 ModelBaseClasses라고하는 OC (또한)가 있으며 응용 프로그램 컨트롤러에서 수동으로 채워집니다. MyViewModel OC 는 ModelCollectionClasses를 호출하며 viewmodel의 ModelBaseClasses를 사용하여 응용 프로그램 컨트롤러에 채워집니다. VM의 ModelBaseClasses에서 ModelBaseClass 객체를 제거 할 수 있지만이 변경 사항의 ModelCollectionClass에 ModelBaseClasses에 알릴 필요가 있습니다. UI가 바인딩되었으므로 ModelBaseClasses에 통지해야합니다 (뷰 모델의 ModelBaseClasses가 아닌). – dgsmith15