我有一个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");
}
}
答案 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事件中解决了这种情况。像那样:
XAML
<data:DataPager x:name="pager" PageIndexChanged="dataPagerGroup_PageIndexChanged" />
C#
private void PageIndexChanged(object sender, EventArgs e)
{
(this.pager.Source as PagedCollectionView).MoveCurrentTo(null);
}