Доступ к содержимому DataGridTemplateColumn

У меня есть столбец шаблона WPF DataGrid, в котором есть DataTemplate для AutoCompleteBox из набора инструментов wpf. Во время процедуры события и проверки RowEditEnding я не могу видеть содержимое в столбце шаблона.

<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);
    }

Когда я помещаю точку останова в свою функцию проверки после создания DataRowView, столбец шаблона пуст. Как мне получить его содержание?


person Eric R.    schedule 13.12.2011    source источник
comment
Чтобы быть ясным, вы хотите, чтобы значение было введено или выбрано пользователем?   -  person slugster    schedule 13.12.2011
comment
Я хочу, чтобы значение было введено пользователем.   -  person Eric R.    schedule 13.12.2011


Ответы (2)


Для начала у вас есть место в Пути вашей привязки для свойства AutoCompleteBox.Text, которое, я думаю, не разрешено.

person JayP    schedule 13.12.2011
comment
Я получаю значение этого столбца для отображения с привязкой, которая у меня есть, когда я загружаю строку из базы данных. Я думаю, что это работает, потому что я загружаю строку с помощью SqlCommand, и имя возвращаемого столбца пишется таким же образом. - person Eric R.; 13.12.2011

После изучения этого кажется, что это не имеет ничего общего с DataGridTemplateColumn, а скорее с AutoCompleteBox из Wpf Toolkit. AutoCompleteBox был для меня не чем иным, как проблемой с тех пор, как я начал его использовать. В результате я решил отказаться от него и использовать вместо него Editable ComboBox. Поле со списком намного чище и проще в реализации. Вот как теперь выглядит мой код, и 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>

Отложенный код (this.Types - наблюдаемая коллекция строк)

    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);
        }
    }
person Eric R.    schedule 16.12.2011