0

我多次尝试解决这个问题。在 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;
        }
    }
4

0 回答 0