C# 访问DataGridTemplateColumn内容

C# 访问DataGridTemplateColumn内容,c#,wpf,datagrid,datagridtemplatecolumn,C#,Wpf,Datagrid,Datagridtemplatecolumn,我有一个WPF DataGrid templatecolumn,它有一个来自WPF工具包的自动完成框的DataTemplate。在RowEditEnding事件和验证过程中,我无法看到templatecolumn中的内容 <DataGridTemplateColumn Header="Account Type" > <DataGridTemplateColumn.CellTemplate> <DataTemplate>

我有一个WPF DataGrid templatecolumn,它有一个来自WPF工具包的自动完成框的DataTemplate。在RowEditEnding事件和验证过程中,我无法看到templatecolumn中的内容

<DataGridTemplateColumn Header="Account Type" >
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <toolkit:AutoCompleteBox Text="{Binding Path='Account Type'}" Populating="PopulateAccountTypesACB" IsTextCompletionEnabled="True" BorderThickness="0" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>



public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        if ((value as BindingGroup).Items.Count == 0)
            return new ValidationResult(true, null);

        DataRowView row = (value as BindingGroup).Items[0] as DataRowView;

        if (row != null)
        {
            if (ValidateAccountName(row.Row.ItemArray[0].ToString()))
            {
                return new ValidationResult(true, null);
            }
            else
            {
                return new ValidationResult(false,
                    "Account Name must be between 1 and 100 Characters.");
            }
        }
        else
            return new ValidationResult(true, null);
    }

公共覆盖验证结果验证(对象值,System.Globalization.CultureInfo CultureInfo)
{
if((值为BindingGroup).Items.Count==0)
返回新的ValidationResult(true,null);
DataRowView行=(值为BindingGroup)。项[0]为DataRowView;
如果(行!=null)
{
if(ValidateAccountName(row.row.ItemArray[0].ToString()))
{
返回新的ValidationResult(true,null);
}
其他的
{
返回新的ValidationResult(false,
“帐户名必须介于1到100个字符之间。”);
}
}
其他的
返回新的ValidationResult(true,null);
}

当我在创建DataRowView后在验证函数中放置断点时,template列为空。如何获取其内容?

首先,您的绑定路径中有一个空间用于AutoCompleteBox.Text属性,我认为这是不允许的。

仔细研究后,它似乎与DataGridTemplateColumn无关,而与Wpf工具包中的AutoCompleteBox无关。自从我开始使用自动完成盒以来,它对我来说只不过是个麻烦。因此,我决定放弃它,改用一个可编辑的组合框。组合框更干净,实现起来更简单。下面是我的代码现在的外观,datarowview能够看到用户在框中键入的内容:

<DataGridTemplateColumn Header="Account Type">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path='Account Type'}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ComboBox IsEditable="True" LostFocus="LostFocusAccountTypes" ItemsSource="{DynamicResource types}" Height="23" IsTextSearchEnabled="True"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

为了清楚起见,是否希望用户键入或选择值?我希望用户键入值。我正在获取此列的值,以便在从数据库加载行时显示该列的绑定。我认为这是可行的,因为我使用SqlCommand加载行,并且返回的列的名称拼写相同。
    private void PopulateAccountTypes()
    {
        try
        {
            string accountQuery = "SELECT AccountType FROM AccountType WHERE UserID = " + MyAccountant.DbProperties.currentUserID + "";

            SqlDataReader accountType = null;
            SqlCommand query = new SqlCommand(accountQuery, MyAccountant.DbProperties.dbConnection);

            accountType = query.ExecuteReader();

            while (accountType.Read())
            {
                this.Types.Add(accountType["AccountType"].ToString());
            }

            accountType.Close();
            Resources["types"] = this.Types;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }