Silverlight: отключить автоматический выбор первой строки после привязки DataGrid

У меня есть 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}"/>

ViewModel:

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 ответа

Решение

Лучший обходной путь - это установить _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); - Эта команда действительно устанавливает для CurrentItem объекта PagedCollectionView значение NULL (не выбран).

Это все еще обходной путь... Было бы замечательно, если бы кто-нибудь придумал лучшее решение.

Не уверен, почему это происходит, если вы как-то не устанавливаете свойство SelectedItem в своем коде.

Простым решением проблемы было бы использование Поведения в DataGrid, которое устанавливает SelectedIndex в -1, когда запускается загруженное событие.

Я решил ситуацию, поставив 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);
    }
    

Первое, что приходит на ум, это то, что вам нужно сделать что-то вроде:

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

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

И реализовать ту же стратегию для SelectedItem,

Другие вопросы по тегам