【发布时间】:2015-07-30 07:34:26
【问题描述】:
我正在尝试验证数据网格中的用户输入,我这样做的方式是:
I) 允许用户添加一行
II) 允许用户填充一些单元格
III)当 EndEdit() 事件发生时,我会更新我的模型
IV) 如果模型无法更新(例如当用户没有提供 NotNull 值),则会引发错误。
V) 这是棘手的部分!我想留在数据网格的错误行上,但是尽管我已经正确设置了 SelectedIndex 和 SelectedValue,但高亮的行会发生变化。
这是我的 XAML:
<DataGrid x:Name="gd_Contacts" SelectedItem="{Binding SelectedContact,Converter={StaticResource NewPlaceConverter}}"
SelectedIndex="{Binding SelectedItemIndex}"
Margin="0,5,1,0" ItemsSource="{Binding ContactCollection, Mode=TwoWay}"
CanUserAddRows="True" CanUserDeleteRows="False" AutoGenerateColumns="False" Grid.Column="1">
这是我的 ViewModel:
private ObservableCollection<ActionEnabledContacts> FContactCollection;
//....
public ActionEnabledContacts SelectedContact //THE PROPERTY FOR SELECTEDITEM
{
get { return FSelectedContact; }
set
{
//
List <ActionEnabledContacts> InvalidList=ContactCollection.Where<ActionEnabledContacts>(p => p.cnt_Key == 0).ToList();
if (InvalidList != null && InvalidList.Count > 0)
{
//now find index of that bastard
List<ActionEnabledContacts> AllContacts = ContactCollection.ToList();
int BastardIndex = 0;
foreach (ActionEnabledContacts AContact in AllContacts)
{
if (AContact.cnt_Key == 0)
{
FSelectedContact = InvalidList[0];
NotifyPropertyChanged();
SelectedItemIndex = BastardIndex;
//^^^^ THIS LINE DO UPDATE SELECTEDINDEX AND CALL NotifyPropertyChanged()
}
BastardIndex++;
}
}
else
{
//
FSelectedContact = value;
NotifyPropertyChanged();
}
}
}
【问题讨论】:
-
要实现此行为,请尝试使用 Dispatcher.Invoke 设置 SelectedItemIndex 属性