在DataGrid中动态添加的CommandProperty到按钮列不起作用

时间:2012-05-24 15:48:33

标签: wpf button binding command controltemplate

我有DataGrid绑定到ObservableCollection。我动态添加cols。 Cols struc是第一个col是TextBlock休息所有都是按钮。我对按钮有一些问题:

我想为该col设置Command,使用2个参数(String,String)调用函数“OpenTORWindow”。我无法弄清楚如何设置它。添加cols的代码如下:

FrameworkElementFactory buttonTemplate = null;
for (int i = 0; i < GlobalUtils.TOR_List.Count; i++)
{                
    buttonTemplate = new FrameworkElementFactory(typeof(Button));                
    switch (i) {
        case 0:
            buttonTemplate.SetBinding(Button.ContentProperty, 
                                      new Binding("CLVButtonText"));
            break;
        case 1:
            buttonTemplate.SetBinding(Button.ContentProperty, 
                                      new Binding("MKBLButtonText"));
            break;
    }
    buttonTemplate.SetBinding(Button.CommandProperty, new Binding("MyCommand"));

    RoutedEventHandler handler = new RoutedEventHandler(OpenNewWindow);
    buttonTemplate.AddHandler(Button.ClickEvent, handler, true);
    this.seivesTorGrid.Columns.Add(new DataGridTemplateColumn()
    {
        Header = GlobalUtils.TOR_List[i].TOR_Id, 
        CellTemplate = new DataTemplate() { VisualTree = buttonTemplate  }
    });                
}

我将MyCommand指定为:

MyCommand = new RelayCommand(param => this.OpenWindow(s.SeiveIdSize))

但MyCommand从未被触发过。然后我添加了AddHandler,这是有效的。 任何想法为什么CommandProperty不工作。

1 个答案:

答案 0 :(得分:1)

您要添加的按钮与DataGrid中的当前行共享DataContext,因此当您调用'MyCommand'时,WPF会在TOR_List中搜索该对象,并且因为它可能不存在,所以它不会执行。 您可以检查输出窗口以检查绑定错误。

要实现您的目标,您必须在TOR_List所属的对象中创建命令,或者使用RelativeSource。