Доступ к содержимому DataGridTemplateColumn - PullRequest
0 голосов
/ 13 декабря 2011

У меня есть шаблонная колонка 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, столбец шаблона становится пустым.Как бы получить его содержимое?

Ответы [ 2 ]

0 голосов
/ 16 декабря 2011

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

Code Behind (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);
        }
    }
0 голосов
/ 13 декабря 2011

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

...