Silverlight数据网格运行时添加和绑定

时间:2012-12-12 14:58:58

标签: silverlight binding

我需要在运行时向silverlight列添加列,并执行列的绑定。

这就是我在xaml中静态执行的方式

<sdk:DataGridTextColumn  CanUserReorder="True" CanUserResize="True" CanUserSort="True"  Header="CriteriaName" Width="2*" Binding="{Binding Path=[CriteriaName]}" IsReadOnly="True"  />

现在我想在代码背后做同样的事情,

这就是我所做的

 foreach(string Col in lColumnNames)
            {
                DataGridTextColumn DGCol=new DataGridTextColumn();
                DGCol.Header= Col;


                Binding lObjBinding = new Binding(Col);
                lObjBinding.Mode = BindingMode.OneWay;

                DGCol.Binding = lObjBinding;
                GrdQuickFindResult.Columns.Add(DGCol);


            }

这不起作用。我可以看到DataGrid中的空白行,就像绑定没有发生一样。请检查并告诉我是否所有使用xaml完成的事情都是使用C#完成的,或者是否有一些属性留在我创建的绑定对象中设置。 感谢名单

2 个答案:

答案 0 :(得分:1)

像这样的绑定:

"{Binding Path=MyProperty}" 

只是一种冗长的写作方式:

"{Binding MyProperty}"

以同样的方式

Binding b = new Binding();

相同
Binding b = new Binding("MyProperty");

并且意味着您将TextBoxColumn的文本绑定到数据对象中属性“MyProperty”的值,该属性将被设置为DataGrid中行的DataContext。为此,我们假设您的数据对象类似于:

public class DataObject{
    public object MyProperty {get; set;}
}

如果你的数据对象是这样的,你后面的代码中的绑定就可以了,它们应该可以工作。

当您指定类似的绑定时:

"{Binding Path=[MyProperty]}" 

或者

"{Binding [MyProperty]}"

您正在绑定数据对象的indexer(如果它实现了一个)并且访问了对应于索引“MyProperty”的值。如果你这样做,我假设你的数据对象是一个IDictionary或一个实现索引器的类,如:

public class DataObject{
    public object this[object index]
    {
        get{ /*return something*/ }
        set { /*set something*/ }
    }
}

只是一个建议:对你的局部变量使用camel case,对于看你的代码的其他人看起来很奇怪,看起来它们是实例属性或静态字段。

答案 1 :(得分:0)

 foreach(string Col in lColumnNames)
            {
                DataGridTextColumn DGCol=new DataGridTextColumn();
                DGCol.Header= Col;

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

                //=====This is what was missing======================//
                lObjBinding.Path = new PropertyPath("["+Col+"]");
                //==================================================//

                DGCol.Binding = lObjBinding;
                GrdQuickFindResult.Columns.Add(DGCol);


            }