我需要在运行时向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#完成的,或者是否有一些属性留在我创建的绑定对象中设置。 感谢名单
答案 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);
}