我找不到類似的案例,所以我奮鬥了。我是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