Как динамически добавить конвертер в коде позади - PullRequest
9 голосов
/ 23 февраля 2010

Я связываю сетку данных с динамическими данными через IDictionary: http://www.scottlogic.co.uk/blog/colin/2009/04/binding-a-silverlight-datagrid-to-dynamic-data-via-idictionary/comment-page-1/#comment-8681

Но я не хочу определять столбцы в xaml (ниже показано, как это делается в посте Колина Эберхардта

<data:DataGrid.Columns>
    <data:DataGridTextColumn Header="Forename" Binding="{Binding Converter={StaticResource RowIndexConverter}, ConverterParameter=Forename}" />
</data:DataGrid.Columns>

Итак, я написал следующий код, чтобы попытаться сделать то же самое в коде позади, но код не вызывает RowIndexConverter. Что-то должно быть не хватает.

Код:

// add columns

DataGridTextColumn textColumn = new DataGridTextColumn();
textColumn.Header = "Forename";

Binding bind = new Binding("Forename");
bind.Converter = new RowIndexConverter() ;
bind.ConverterParameter = "Forename";            

textColumn.Binding = bind;
_dataGrid.Columns.Add(textColumn);

Остальная часть кода (здесь для контекста):

// generate some dummy data
Random rand = new Random();
for (int i = 0; i < 200; i++)
{
    Row row = new Row();
    row["Forename"] = s_names[rand.Next(s_names.Length)];
    row["Surname"] = s_surnames[rand.Next(s_surnames.Length)];
    row["Age"] = rand.Next(40) + 10;
    row["Shoesize"] = rand.Next(10) + 5;

    _rows.Add(row);
}

// bind to our DataGrid
_dataGrid.ItemsSource = _rows;    

public class Row
{
    private Dictionary<string, object> _data = new Dictionary<string, object>();

    public object this[string index]
    {
        get
        {
            return _data[index];
        }
        set
        {
            _data[index] = value;
        }
    }
}

1 Ответ

8 голосов
/ 25 февраля 2010

Преобразователь вызывается после получения данных через путь свойства. Так как в строке нет свойства «Имя», оно не работает (вы можете увидеть исключение «Привязка» в окне «Вывод»).

Я решил это, изменив определение привязки на:

    Binding bind = new Binding();
    bind.Mode = BindingMode.OneWay;

, поскольку у вас не может быть двусторонней привязки без пути (исключение, которое я получил без второй строки). Отсутствие пути к свойствам имеет смысл, если подумать, поскольку мы хотим привязать к полному объекту Row, а не к одному из его свойств.

Примечание: протестировано с VS 2008 SP1, проект WPF.

...