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. Как это:
XAML
<data:DataPager x:name="pager" PageIndexChanged="dataPagerGroup_PageIndexChanged" />
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
,