4

我有一个 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");
    }
}
4

4 回答 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 的 CurrentItem 设置为 null(未选中)。

它仍然是一种解决方法......如果有人提出更好的解决方案,那就太好了。

于 2011-10-03T11:59:35.707 回答
2

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

该问题的一个简单解决方案是在触发加载的事件时使用 DataGrid 上的 Behavior 将 SelectedIndex 设置为 -1。

于 2011-09-29T15:31:12.600 回答
0

首先想到的是您需要执行以下操作:

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

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

并为SelectedItem.

于 2011-09-29T15:32:27.827 回答
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);
    }
    
于 2015-10-17T19:43:59.407 回答