我多次尝试解决这个问题。在 DataGrid 中,我显示有关金融交易的数据。一列是 Account 类,它是一个导航属性 (EF)。我有一个简单的验证。Account 属性不应为空。
这是专栏:
<DataGridTemplateColumn Header="{x:Static r:Resource.AccountName}"
CellTemplate="{StaticResource AccountTemplate}"
CellEditingTemplate="{StaticResource AccountEditingTemplate}" />
以下是数据模板:
<DataTemplate x:Key="AccountEditingTemplate">
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type DataGrid}}, Path=DataContext.AccountObjects}"
SelectedItem="{Binding Account, ValidatesOnDataErrors=True, UpdateSourceTrigger=LostFocus}"
DisplayMemberPath="Name" Style="{StaticResource ComboBoxError}" IsEditable="True"
ToolTip="{Binding Account.Name}" />
</DataTemplate>
<DataTemplate x:Key="NameTemplate">
<TextBlock Text="{Binding Name}" ToolTip="{Binding Name}"/>
</DataTemplate>
<DataTemplate x:Key="AccountTemplate">
<ContentControl Content="{Binding Path=Account, ValidatesOnDataErrors=True}"
ContentTemplate="{StaticResource NameTemplate}"/>
</DataTemplate>
CellEditingTemplate 显示带有潜在帐户的组合框。CellTemplate 很棘手。在 AccountTemplate 我绑定了 Account 所以我正确地得到了验证错误。然后我使用 NameTemplate 将 Account.Name 显示为 TextBlock。(以前我绑定了“Account.Name”,但如果 Account 为空(例如在新行中),验证嵌套属性并不容易)。
如果我想更改现有行中的帐户,那么一切正常。
如果我想在新行中更改帐户,则不会出现组合框!(一个更令人困惑的事实,如果我单击新行中的帐户然后出现组合框,如果然后我转到另一列我无法取回组合框)
更新 1
我的问题是双击无法打开编辑模式。这是验证(但如果没有验证,问题仍然会发生)
override public string this[string columnName]
{
get
{
var errorMessage = string.Empty;
switch (columnName)
{
case "Instrument":
if (Instrument == null)
errorMessage = nameof(Instrument) + " " + GlobalValues.AppData["must be given!"];
break;
case "Account":
if (Account == null)
errorMessage = nameof(Account) + " " + GlobalValues.AppData["must be given!"];
break;
}
return errorMessage;
}
}