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?
答
尝试设置selectedIndex回原来这样
Dispatcher.BeginInvoke(new Action(() => docgrid.SelectedIndex = oldIndex), DispatcherPriority.DataBind);
如果它不会工作,尝试使用另一个重点。
由于ItemsSource受docItems属性约束,所有的项目都是“刷新”的,它就像名称所说的那样,是一个项目“源代码更改”。所以对于wpf,有一个可以理解的理由来抛弃旧的来源的选择索引。在你的情况下,在ItemsSource改变后,可能会有一些新的,一些旧的条目给用户,并且你想保留可视旧条目的索引?如果是这样的话,我会这样做:将选定的对象保留为viewmodel属性,将源更改后的内容与每个新项目进行比较。如果找到了,则将selectionindex设置为not,并将其保留为零。 – deafjeff
我对这个Item本身并不是很感兴趣,但是我想保留选中的行,即使在RaisePropertyChanged之后。你提到我应该在sourcechange之后设置选定的索引,这就是我想要的,但是索引设置为0,不管我做什么。 – Pets
这听起来是索引(它是绑定的双向我猜)被覆盖为零在新集合绑定到itemssource。所以请确保它不被覆盖。您可以在RaisePropertyChanged(“DocItems”)之前轻松设置一个标志以防止在您的视图模型中出现此问题; – deafjeff