2012-05-21 86 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