我找不到类似的案例,所以我奋斗了。我是Silverlight的新手,很难与ICollectionView刷新。 Refresh-Method实际上并不会刷新我数据网格中的数据,尽管它们发生了变化(在调试器中查看它,并在对数据网格进行了几次排序后,它最终会反映出这些变化)。恐怕我完全搞砸了我的应用程序的整个构造。我认为这个问题与我实现的“MainViewModel-ChildViewModel”原理有关。Silverlight - MVVM:Datagrid绑定到ICollectionView,填充“ChildViewModel”不会刷新数据
这是我的构造: 在我的主页中,我添加了一个“Main Viewmodel”作为资源。
<UserControl.Resources>
<vm:WorkingBasketViewModel x:Key="VMMain"/>
</UserControl.Resources>
网格LayoutRoot然后将它的datacontext此视图模型:
<Grid x:Name="LayoutRoot" DataContext="{StaticResource VMMain}" Margin="20">
........// all the content
</Grid>
在“主视图模型”我定义,其保持将在的形式被显示在数据网格中的数据的ObservableCollection CollectionViewSource。 ObservableCollection项目基于表示实际数据的“ChildViewModel”,它是每个数据行的逻辑。方式:添加到ObservableCollection的每个项目都是“ChildViewModel”的类型。 我是这样设计的,因为我将显示几个“细节页面”(基于所选功能或双击单元格),然后允许查看,修改和处理另一个用户控件中的数据。数据网格中的直接修改是不允许的。这样,我只需要将childviewmodel传递给下一页(或usercontrol),并传递数据及其逻辑。
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;
}
}
在的完成事件处理程序分贝取与childviewmodel
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();
}
填充的ObservableCollection我还具有上被绑定到该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”或其继承的实例初始化的用户控件。 (有一些功能是与其他一些功能的childwindow它表明,显示所有的细节等一个用户控件),例如childwindow
:
ShowChildWindow(new PkgRequestDataControl(_vm.CurrentRequest)); --> PkgRequestDataControl inherits from childviewmodel. _vm.CurrentRequest is one single instance of "childviewmodel" that is given
现在我修改的日期在这个childwindow的回归主页。 在返回时,我调用collectionView(Requests.Refresh();) - >刷新但是数据不会刷新。 好..有时它确实,但它的大部分时间,直到我排序数据网格的变化的颜色2-3次(点击标题进行排序和排序,并排序)
我在做什么错误?任何人都可以帮忙吗?整个结构是否混乱?
干杯 Elime
hmm在_requestCollectionView.CurrentItem的已更改属性上尝试了PropertyChanged,但这无济于事。 Datagrid不会更新该行 – elime
您需要在视图绑定到的View属性更改时引发PropertyChanged事件。在这种情况下,它看起来像是您的请求属性。因此,您可以调用Requests.Refresh()来重新创建Requests的视图属性,然后在请求发生更改后提出PropertyChanged。 –
没有抱歉,这将无济于事。仍然是同样的行为 - >数据网格在排序2次后更新更改的行,但不会直接改变更改。 – elime