我有一个 Silverlight
DataGrid
、一个 DataPager
和一个 PagedCollectionView
。
将 PagedCollection 视图绑定到 DataGrid
后,DataGrid
的第一行被选中。
如果我使用ObservableCollection
,则
不会发生这种行为。但由于
DataPager
,我需要使用
PagedCollectionView
。我正在使用 Silverlight 5 RC 和 SL 4 Toolkit。
使用示例:
查看:
<sdk:DataGrid x:Name="gridSomeItems" ItemsSource="{Binding SomeItems, Mode=TwoWay}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" CanUserSortColumns="True">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="Column1" Width="*" Binding="{Binding Column1}" />
</sdk:DataGrid.Columns>
</sdk:DataGrid>
<sdk:DataPager Source="{Binding Path=ItemsSource, ElementName=gridSomeItems}"/>
视图模型:
public class SomeViewModel : ViewModelBase
{
public SomeViewModel(IDataAccess dataAccess)
{
_dataAccess = dataAccess;
_dataAccess.GetSomeItemsCompleted += GetSomeItemsCompleted;
_dataAccess.GetSomeItems();
}
public PagedCollectionView SomeItems { get; set; }
public SomeItem SelectedItem { get; set; }
private void GetSomeItemsCompleted(GetSomeItemsCompletedEventArgs e)
{
SomeItems = new PagedCollectionView(e.Result.SomeItems);
RaisePropertyChanged("SomeItems");
}
}
_isLoading
标志。以下代码是 ViewModel 的正确代码:
public class SomeViewModel : ViewModelBase
{
private bool _isLoading;
public SomeViewModel(IDataAccess dataAccess)
{
_dataAccess = dataAccess;
_dataAccess.GetSomeItemsCompleted += GetSomeItemsCompleted;
_isLoading = true;
_dataAccess.GetSomeItems();
}
public PagedCollectionView SomeItems { get; set; }
public SomeItem SelectedItem { get; set; }
private void GetSomeItemsCompleted(GetSomeItemsCompletedEventArgs e)
{
SomeItems = new PagedCollectionView(e.Result.SomeItems);
SomeItems.CurrentChanged += CurrentItemChanged;
RaisePropertyChanged("SomeItems");
SomeItems.MoveCurrentTo(null);
_isLoading = false;
}
private void CurrentItemChanged(object sender, System.EventArgs e)
{
if (!_isLoading)
{
SelectedItem = SomeItems.CurrentItem as SomeItem;
// Do something more...
}
}
}
请查看该行
SomeItems.MoveCurrentTo(null);
- 此命令实际上将 PagedCollectionView 的 CurrentItem 设置为 null(未选择)。这仍然是一种解决方法......如果有人想出更好的解决方案,那就太好了。
该问题的一个简单解决方案是在 DataGrid 上使用行为,在加载事件触发时将 SelectedIndex 设置为 -1。
private PagedCollectionView someItems;
public PagedCollectionView SomeItems
{
get { return someItems; }
set
{
if (someItems != value)
{
someItems = value;
RaisePropertyChanged("SomeItems");
}
}
}
并对
SelectedItem
实施相同的策略。
MoveCurrentTo(null)
放入 PageIndexChanged 事件中解决了这个问题。像这样:
<data:DataPager x:name="pager" PageIndexChanged="dataPagerGroup_PageIndexChanged" />
private void PageIndexChanged(object sender, EventArgs e)
{
(this.pager.Source as PagedCollectionView).MoveCurrentTo(null);
}