Новичок, использующий GridView CellTemplate из C # - PullRequest
0 голосов
/ 03 апреля 2011

Я учусь создавать сетку свойств стиля Visual Studio. У меня есть 2 столбца GridView, в настоящее время привязка ОК к списку объектов с двумя строковыми членами. Хорошо до сих пор. Я хочу, чтобы во втором столбце использовались поля ввода текста, чтобы я мог обновить эти значения. Я много смотрел онлайн, но могу найти только примеры XAML. Что я получил до сих пор (не работает, показывает только не редактируемый текст) ...

        GridView gv = new GridView();
        View = gv;

        // First Collumn - Name.
        GridViewColumn col = new GridViewColumn();
        col.Header = "Property";
        col.Width = 100;
        col.DisplayMemberBinding = new Binding("Name");
        gv.Columns.Add(col);

        // 2nd Column - Value.
        col = new GridViewColumn();
        col.Header = "Value";
        col.Width = 100;
        col.DisplayMemberBinding = new Binding("DefaultValue");

        FrameworkElementFactory txt = new FrameworkElementFactory(typeof(TextBox));
        txt.SetBinding(TextBox.TextProperty, new Binding()); // sets binding

        // add textbox template
        col.CellTemplate = new DataTemplate(typeof(string));
        col.CellTemplate.VisualTree = txt;

        gv.Columns.Add(col);

1 Ответ

2 голосов
/ 03 апреля 2011

+ 1 в комментариях об использовании XAML для этого, но это не отвечает на ваш вопрос.

Я подозреваю, что причина того, что текстовые поля доступны только для чтения, заключается в том, что вы привязаны непосредственно к строке. Если WPF позволяет вам редактировать его, где он будет хранить строку? Как вы знаете, строки в .NET являются неизменяемыми.

Попробуйте это:

class StringContainer
{
     public string SomeValue { get; set; }
} 

Теперь подключите это так:

FrameworkElementFactory txt = new FrameworkElementFactory(typeof(TextBox));
txt.SetBinding(TextBox.TextProperty, new Binding("SomeValue")); // sets binding

// add textbox template
col.CellTemplate = new DataTemplate(typeof(StringContainer));

Когда вы связываете данные, не забудьте обернуть редактируемые строки в StringContainer объекты.

myDataRow.DefaultValue = new StringContainer("Some string");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...