에서 (같은 종류의) 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가 제대로 업데이트되도록합니다.
일부 사람들이 모델 컬렉션과 뷰 모델 컬렉션을 동기화하는 래퍼 클래스를 만든 몇 가지 다른 예를 보았지만 내 자신의 응용 프로그램에서 그런 것을 구현하는 데 어려움을 겪고 있습니다. 모든 통찰력 또는 도움이되는 힌트/아이디어는 크게 평가 될 것입니다.
누군가가 당신을 위해이 큰 코드를 파싱 할 확신합니까? 간결하게하려고하십시오. – RredCat
코드가 상당히 깔끔하다는 것을 알고 있지만 최대한 투명하게하려고 노력 중입니다. 그러나 주셔서 감사합니다. – dgsmith15
ModelBaseClass를 삭제하는 방법을 살펴 보는 것이 흥미로울 것입니다.하지만 바로 그럴 경우 ModelBaseClass 및 ModelCollectionClass에 대한 NotifyPropertyChanged를 올려야합니다. – BigL