wpf mvvm中的Datagrid selecteindex在RaisePropertyChanged上设置为0

本文关键字:设置 RaisePropertyChanged mvvm 中的 Datagrid selecteindex wpf | 更新日期: 2023-09-27 17:49:49

我正在c# Wpf中使用mvvm light开发一个项目。

在这个项目中,我有一个数据网格与SelectedIndex绑定到ViewModel中的int。

DocumentViewModel:

private int _docSelectedIndex;
    public int DocSelectedIndex
    {
        get { return _docSelectedIndex; }
        set
        {
            _docSelectedIndex = value;
            RaisePropertyChanged("DocSelectedIndex");
        }
    }

The View:

<DataGrid HeadersVisibility="Column"
                  x:Name="docgrid" 
                  IsSynchronizedWithCurrentItem="True"
                  DataContext ="{Binding Document, Source={StaticResource Locator}}"
                  ItemsSource="{Binding Path=DocItems}"
                  SelectedIndex="{Binding DocSelectedIndex,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
             ...
             ...
</DataGrid>

绑定成功了!但是每当我想用新数据更新网格时,我需要RaisePropertyChanged("DocItems")。

这似乎将selecteindex更改为0。我试过将selecteindex设置回原来的值,但是索引最后总是设置为0。

这个方法调用了RaisePropertyChanged:

public void UpdateDocumentList(object sender, TypedEventArg<DocListUpdatedEvent> e) 
    {
        var temp = new List<SFODocument>(e.Value.DocumentList);
        var meta = _meta.GetPageMetaData();
        foreach (var d in temp)
        {
            foreach (int i in d.PageList) 
            {
                meta[i].docid = d.DocumentID;
                _meta.UpdateExistingMeta(meta[i]);
            }
        }
        _docItems = new ObservableCollection<SFODocument>(temp);
        RaisePropertyChanged("DocItems");
    }

如何在更新数据网格的同时保持原来的selectedIndex ?

wpf mvvm中的Datagrid selecteindex在RaisePropertyChanged上设置为0

尝试用这种方法将selecteindex设置回初始值

Dispatcher.BeginInvoke(new Action(() => docgrid.SelectedIndex = oldIndex), DispatcherPriority.DataBind);