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

4
我有一个Silverlight的DataGrid,一个DataPager和一个PagedCollectionView。当PagedCollectionView绑定到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个回答

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的当前项目设置为null(未选择)。
这仍然是一个解决方法......如果有人想出更好的解决方案就太好了。

2

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

解决问题的简单方法是在DataGrid上使用一种行为(Behavior),当加载事件触发时将SelectedIndex设置为-1。


哦,那可能是一个解决方法——但是当DataPager移动到下一页时,SelectedItem也会发生变化。因此,我也必须捕获这个事件... - Gerwald

0

首先想到的是你需要做类似于这样的事情:

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

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

并将相同策略应用于 SelectedItem


没错,但我在Load-Completed事件中触发了RaisePropertyChanged(如果您查看方法“GetSomeItemsCompleted”)。不需要引发“SelectedItem”,因为这应该只由网格设置,而不是ViewModel。 - Gerwald

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); }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接