4

私は Silverlight DataGrid、 a 、DataPagerおよび aを持ってい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プロパティを設定していない限り、なぜそれが起こっているのかわかりません。

この問題の簡単な解決策は、ロードされたイベントが発生したときにSelectedIndexを-1に設定するDataGridの動作を使用することです。

于 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 に答える