Silverlight: отключить автоматический выбор первой строки после привязки DataGrid - PullRequest
4 голосов
/ 29 сентября 2011

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

3 голосов
/ 03 октября 2011

Лучший обходной путь - установить флаг _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 (не выбран).

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

2 голосов
/ 29 сентября 2011

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

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

0 голосов
/ 17 октября 2015

Я решил ситуацию, поместив 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);
    }
    
0 голосов
/ 29 сентября 2011

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

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

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

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

...