如何在代码后台动态添加转换器

9
我正在使用IDictionary将动态数据绑定到DataGrid:http://www.scottlogic.co.uk/blog/colin/2009/04/binding-a-silverlight-datagrid-to-dynamic-data-via-idictionary/comment-page-1/#comment-8681。但我不想在xaml中定义任何列(以下是Colin Eberhardt的帖子中如何实现的)。
<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个回答

9
转换器是在通过属性路径获取数据后调用的。由于Row中没有“Forename”属性,因此它无法工作(您可以在输出窗口中看到绑定异常)。我通过更改绑定定义来解决了这个问题:
    Binding bind = new Binding();
    bind.Mode = BindingMode.OneWay;

没有路径就无法进行双向绑定(没有第二行时出现的异常)。仔细想想,没有属性路径是有道理的,因为我们要绑定到整个Row对象,而不是它的一个属性。

注意:在VS 2008 SP1、WPF项目中测试通过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接