我还没有找到类似的案例,所以我一直在努力。我是 Silverlight 的新手,并且为 ICollectionView 的刷新而苦苦挣扎。刷新方法实际上不会刷新我的数据网格中的数据,尽管它们已更改(在调试器中查看它,在对数据网格进行几次排序后,它最终会反映更改)。恐怕我完全搞砸了我的应用程序的整个结构。我认为这个问题与我实现的“MainViewModel-ChildViewModel”原理有关。
这是我的构造:在我的主页中,我添加了一个“主视图模型”作为资源。
<UserControl.Resources>
<vm:WorkingBasketViewModel x:Key="VMMain"/>
</UserControl.Resources>
然后 Grid LayoutRoot 将它的 datacontext 设置为此视图模型:
<Grid x:Name="LayoutRoot" DataContext="{StaticResource VMMain}" Margin="20">
........// all the content
</Grid>
在“主视图模型”中,我定义了一个 ObservableCollection,它保存将以 CollectionViewSource 形式显示在数据网格中的数据。ObservableCollection 项目基于代表实际数据的“ChildViewModel”,它是每个数据行的逻辑。意思是:添加到 ObservableCollection 的每个项目都是“ChildViewModel”的类型。我这样设计它是因为我将显示几个“详细信息页面”(基于选择的功能或双击单元格),然后允许查看、修改和处理另一个用户控件中的数据。不允许在数据网格中直接修改。这样,我只需要将 childviewmodel 传递到下一页(或用户控件),然后传递数据及其逻辑。
private readonly ObservableCollection<childViewModel> _requestList = new ObservableCollection<childViewModel>(); // saves list of "childviewmodel-items"
private readonly ICollectionView _requestCollectionView; // ICollectionView for _requestlist-Collection.
// In the contstructor of the "Main Viewmodel"
var cvs = new CollectionViewSource {Source = _requestList};
cvs.SortDescriptions.Add(new SortDescription("RPI_Priority", ListSortDirection.Ascending));
cvs.SortDescriptions.Add(new SortDescription("REQ_TestingDate", ListSortDirection.Ascending));
_requestCollectionView = cvs.View;
LoadData(); // db-fetch (entity framework)
/// <summary>
/// Binding to DataGrid!
/// </summary>
public ICollectionView Requests //-> BINDING TO DATAGRID!
{
get
{
return _requestCollectionView;
}
}
在 db-fetch 的 Completed 事件处理程序中,使用 childviewmodel 填充 observablecollection
private void requests_requestLoadingComplete(object sender, EntityResultsArgs<REQ_Request> e)
{
if (!e.HasError)
{
//Fire Event on UI Thread
Application.Current.RootVisual.Dispatcher.BeginInvoke(() =>
{
var o = e.Results.OrderBy(r => r.REQ_TestingDate);
//clear request list
_requestList.Clear();
// add requests to collectionview
foreach (REQ_Request r in o)
{
// for each record generate a Childviewmodel entry and add it to the observable collection
_requestList.Add(new childviewmodel(r));
}
});
}
else
{
// notify if there is any error
reportError(this,new ResultsArgs(e.Error));
}
RaiseVMStateChanged();
}
我在主页上还有一个绑定到此 ICollectionView 的数据网格。itemsource 是“ChildViewModel”列表。它的属性是绑定的:
<sdk:DataGrid AutoGenerateColumns="False" Grid.Row="1" ItemsSource="{Binding Path=Requests}" SelectionMode="Single">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="ID" Binding="{Binding REQ_ID}" Width="40" IsReadOnly="true"/>
<sdk:DataGridTextColumn Header="Applikationsname" Binding="{Binding REQ_ApplicationName}" Width="250" IsReadOnly="true"/>
<sdk:DataGridTextColumn Header="Typ" Binding="{Binding RET_Type}" Width="70" IsReadOnly="true"/>
<sdk:DataGridTextColumn Header="Prio" Binding="{Binding RPI_Priority}" Width="70" IsReadOnly="true" />
<sdk:DataGridTextColumn Header="Status" Binding="{Binding RST_Status}" Width="70" IsReadOnly="true"/>
<sdk:DataGridTextColumn Header="Sprache" Binding="{Binding SWL_Language}" Width="70" IsReadOnly="true"/>
<sdk:DataGridTextColumn Header="Version" Binding="{Binding REQ_Version}" Width="70" IsReadOnly="true"/>
<sdk:DataGridTextColumn Header="Betriebssystem" Binding="{Binding SOS_OS}" Width="150" IsReadOnly="true"/>
<sdk:DataGridTextColumn Header="DA" Binding="{Binding Dienstabteilungen}" Width="150" IsReadOnly="true"/>
<sdk:DataGridTextColumn Header="AV" Binding="{Binding AV_Fullname}" Width="150" IsReadOnly="true"/>
<sdk:DataGridTextColumn Header="Paketierer" Binding="{Binding Paketierer_Fullname}" Width="150" IsReadOnly="true"/>
<sdk:DataGridTextColumn Header="Paketierer QS" Binding="{Binding PaketiererQS_Fullname}" Width="150" IsReadOnly="true" />
<sdk:DataGridTextColumn Header="Abnahmetermin" Binding="{Binding REQ_TestingDate}" Width="150" IsReadOnly="true" />
</sdk:DataGrid.Columns>
</sdk:DataGrid>
现在所有这些工作都很好而且很顺利。单击功能按钮时,我打开另一个用“Childviewmodel”实例或继承它初始化的用户控件。(某些功能是子窗口和其他功能,它显示了一个显示所有详细信息等的用户控件)
例如子窗口:
ShowChildWindow(new PkgRequestDataControl(_vm.CurrentRequest)); --> PkgRequestDataControl inherits from childviewmodel. _vm.CurrentRequest is one single instance of "childviewmodel" that is given
现在我修改这个子窗口中的日期返回到主页。返回时,我在 collectionView (Requests.Refresh();) 上调用 refresh -> 但数据不会刷新。好吧..有时它会,但大多数时候它不会,直到我对数据网格的更改后的coloum进行了2-3次排序(单击标题进行排序和排序..并排序)
我究竟做错了什么?任何人都可以帮忙吗?整个结构混乱吗?
干杯艾莱姆