Silverlight:在 DataGrid 绑定后禁用自动第一行选择

问题描述 投票:0回答:4

我有一个 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"); } }
    
silverlight pagination datagrid silverlight-toolkit pagedcollectionview
4个回答
3
投票
最好的解决方法是设置一个

_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(未选择)。

这仍然是一种解决方法......如果有人想出更好的解决方案,那就太好了。


2
投票
不知道为什么会发生这种情况,除非您以某种方式在代码中设置了 SelectedItem 属性。

该问题的一个简单解决方案是在 DataGrid 上使用行为,在加载事件触发时将 SelectedIndex 设置为 -1。


0
投票
首先想到的是您需要执行以下操作:

private PagedCollectionView someItems; public PagedCollectionView SomeItems { get { return someItems; } set { if (someItems != value) { someItems = value; RaisePropertyChanged("SomeItems"); } } }

并对

SelectedItem

实施相同的策略。


0
投票
我通过将

MoveCurrentTo(null)

 放入 PageIndexChanged 事件中解决了这个问题。像这样:

  1. XAML

    <data:DataPager x:name="pager" PageIndexChanged="dataPagerGroup_PageIndexChanged" />
    
    
  2. C#

    private void PageIndexChanged(object sender, EventArgs e) { (this.pager.Source as PagedCollectionView).MoveCurrentTo(null); }
    
    
© www.soinside.com 2019 - 2024. All rights reserved.