2012-12-12 72 views
0

我需要在运行时向silverlight列添加列,并且还要为列执行绑定。Silverlight DataGrid运行时添加和绑定

这是我如何做到这一点静态的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); 


      } 

这不是working.All我可以看到DataGrid中的空白行,就好像绑定没有发生。请检查并告诉我,如果使用xaml完成的所有操作都是使用C#完成的,还是有一些属性需要在我创建的绑定对象中设置。 感谢名单

+0

您确定您的“Col”列名与您想要绑定的属性名称匹配吗? –

+0

是的,我很确定,,,,,标题名称和属性名称是相同的, –

+0

可以告诉我如何使用c#Binding =“{Binding Path = [CriteriaName]} wtite以下一段xaml代码” 我如何设置路径属性。只是 绑定lObjBinding =新绑定(上校)没有帮助 我试图从xaml中删除路径关键字,我看到的是空行,因为我看到当我使用后面的代码绑定。 所以我觉得它因为我不包括这个正确的 ** Binding =“{Binding Path = [CriteriaName]}”**使用c#。 @Arthur –

回答

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); 


      } 
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;} 
} 

如果你的数据对象都是这样的,你的代码绑定的后面,是个好人,他们应该工作。

当你especify绑定,如:

"{Binding Path=[MyProperty]}" 

或者

"{Binding [MyProperty]}" 

你要绑定的数据对象的indexer(如果它实现了一个),并acessing对应值的索引“MyProperty”。如果你这样做,我认为你的数据对象是IDictionary的或它实现了一个索引,就像一个类:

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

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