2012-05-21 50 views
0

我找不到类似的案例,所以我奋斗了。我是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

回答

0

我不知道究竟你使用的ICollectionView的实施,但在一般的ICollectionView。刷新()仅刷新View属性,将筛选,排序和分组考虑在内。对于你的UI来实现这个改变,你仍然需要在调用Refresh()之后实现INotifyPropertyChanged并引发一个PropertyChanged事件。

+0

hmm在_requestCollectionView.CurrentItem的已更改属性上尝试了PropertyChanged,但这无济于事。 Datagrid不会更新该行 – elime

+0

您需要在视图绑定到的View属性更改时引发PropertyChanged事件。在这种情况下,它看起来像是您的请求属性。因此,您可以调用Requests.Refresh()来重新创建Requests的视图属性,然后在请求发生更改后提出PropertyChanged。 –

+0

没有抱歉,这将无济于事。仍然是同样的行为 - >数据网格在排序2次后更新更改的行,但不会直接改变更改。 – elime