【问题标题】:Silverlight: disable automatic first-row selection after DataGrid bindingSilverlight:在 DataGrid 绑定后禁用自动第一行选择
【发布时间】:2011-11-27 18:25:24
【问题描述】:

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

【问题讨论】:

    标签: silverlight datagrid paging silverlight-toolkit pagedcollectionview


    【解决方案1】:

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

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

    【讨论】:

    • 嗯。这可能是一种解决方法 - 但是当 DataPager 移动到下一页时,SelectedItem 也会发生变化。所以我也必须赶上这个活动......
    【解决方案2】:

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

    private PagedCollectionView someItems;
    public PagedCollectionView SomeItems
    {
        get { return someItems; }
    
        set
        {
            if (someItems != value)
            {
                someItems = value;
                RaisePropertyChanged("SomeItems");
            }
        }
    }
    

    并为SelectedItem 实施相同的策略。

    【讨论】:

    • 没错,但我在 Load-Completed 事件中触发了 RaisePropertyChanged(如果您查看方法 GetSomeItemsCompleted)。 SelectedItem 不需要被提升,因为这应该只由网格设置,而不是从 ViewModel 设置。
    【解决方案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(未选中)。

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

    【讨论】:

      【解决方案4】:

      我通过将 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);
        }
        

      【讨论】:

        猜你喜欢
        • 2011-01-03
        • 1970-01-01
        • 2011-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-25
        • 2013-10-07
        • 1970-01-01
        相关资源
        最近更新 更多