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

问题描述:

我正在用mvvm light在c#Wpf中开发一个项目。wpf mvvm中的Datagrid SelectedIndex在RaisePropertyChanged上设置为0

在这个项目中,我有一个SelectedIndex DataMrid绑定到ViewModel中的一个int。

DocumentViewModel:

private int _docSelectedIndex; 
    public int DocSelectedIndex 
    { 
     get { return _docSelectedIndex; } 
     set 
     { 

      _docSelectedIndex = value; 
      RaisePropertyChanged("DocSelectedIndex"); 

     } 
    } 

的观点:

<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”)。

这似乎改变selectedindex为0.我试图设置选定的索引回到原来的,但索引始终设置为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?

+0

由于ItemsSource受docItems属性约束,所有的项目都是“刷新”的,它就像名称所说的那样,是一个项目“源代码更改”。所以对于wpf,有一个可以理解的理由来抛弃旧的来源的选择索引。在你的情况下,在ItemsSource改变后,可能会有一些新的,一些旧的条目给用户,并且你想保留可视旧条目的索引?如果是这样的话,我会这样做:将选定的对象保留为viewmodel属性,将源更改后的内容与每个新项目进行比较。如果找到了,则将selectionindex设置为not,并将其保留为零。 – deafjeff

+0

我对这个Item本身并不是很感兴趣,但是我想保留选中的行,即使在RaisePropertyChanged之后。你提到我应该在sourcechange之后设置选定的索引,这就是我想要的,但是索引设置为0,不管我做什么。 – Pets

+0

这听起来是索引(它是绑定的双向我猜)被覆盖为零在新集合绑定到itemssource。所以请确保它不被覆盖。您可以在RaisePropertyChanged(“DocItems”)之前轻松设置一个标志以防止在您的视图模型中出现此问题; – deafjeff

尝试设置selectedIndex回原来这样

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

如果它不会工作,尝试使用另一个重点。

+0

感谢您的意见。我尝试了所有优先级,但最终仍然将其设置为0。 – Pets

+0

调用UpdateDocumentList()后,docGrid.SelectedIndex = oldIndex可能正常工作! (不需要BeginInvoke())确保您的oldIndex viewmodel属性在ItemsSource更改时不会被覆盖(归零)!这对于使用调试器进行检查很重要。 – deafjeff

+0

我用调试器检查过了,我可以看到oldindex是正确的,并且它设置了选定的索引(在这一点上它仍然是相同的)。但是在设置之后,另一个呼叫的值为0. – Pets