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

时间:2011-09-29 14:25:53

标签: silverlight datagrid paging silverlight-toolkit pagedcollectionview

我有一个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");
    }
}

4 个答案:

答案 0 :(得分: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(未选中)。

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

答案 1 :(得分:2)

不确定为什么会发生这种情况,除非您以某种方式以某种方式在代码中设置SelectedItem属性。

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

答案 2 :(得分:0)

首先想到的是你需要做的事情:

private PagedCollectionView someItems;
public PagedCollectionView SomeItems
{
    get { return someItems; }

    set
    {
        if (someItems != value)
        {
            someItems = value;
            RaisePropertyChanged("SomeItems");
        }
    }
}

SelectedItem实施相同的策略。

答案 3 :(得分: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);
    }