我目前有几个Model对象如下:
public class ModelBaseClass : INotifyPropertyChanged
{
//Members omitted for brevity, but there is a DateTime property
//that becomes important further down (see dummy method in application controller)
}
和另一个:
public class ModelCollectionClass : INotifyPropertyChanged
{
private ObservableCollection<ModelBaseClass> modelBaseClasses;
public ObservableCollection<ModelBaseClass> ModelBaseClasses
{
get { return modelBaseClasses; }
set
{
modelBaseClasses = value;
OnPropertyChanged(new PropertyChangedEventArgs("ModelBaseClasses");
}
}
private void modelBaseClasses_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
OnPropertyChanged(new PropertyChangedEventArgs("ModelBaseClasses"));
}
}
然后在我的一个视图模型中,我有可观察的集合,如:
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...
}
}
应该注意的是,此方法中有多个for循环,因此我可以使用大量数据。
接下来,我有一个方法可以获取大量的对象,并按日期对它们进行分组,如下所示:
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中,我有一个ItemsControl声明,其ItemsSource绑定到我的视图模型中的ModelCollectionClasses属性。它看起来像这样:
<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:
<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>
现在,尽管如此,我正在获得我最初想要的数据的所需视觉表示。但是,我现在遇到的问题是当我想删除一个ModelBaseClass对象时。因为DataGrid的ItemsSource被绑定到ModelCollectionClass的ModelBaseClasses属性,而不是我视图模型中的ModelBaseClasses,所以当我从我的视图模型中找到的ModelCollectionClass中删除ModelBaseClass时,我需要以某种方式通知ModelCollectionClass此更改也将使UI正确更新。
我看过其他一些例子,其中有些人已经创建了包装类来同步模型集合和视图模型集合,但是我很难用自己的应用程序来实现这样的事情。任何见解或有用的提示/想法将不胜感激。
答案 0 :(得分:0)
ModelCollectionClass
中设置了ModelBaseClass
属性,但通知您设置了ModelBaseClasses
( es )。不确定它会有所帮助。