以编程方式为DataTemplate元素设置绑定

时间:2015-03-31 10:18:36

标签: wpf binding datatemplate code-behind

我有这样的模板

<Window.Resources>
    <DataTemplate x:Key="MemberCoefDataTemplate">
        <StackPanel>
            <CheckBox Name="CheckBox"></CheckBox>
            <TextBox Name="TextBox"></TextBox>
        </StackPanel>
    </DataTemplate>
</Window.Resources>

我在网格中使用它

<DataGridTemplateColumn CellTemplate="{StaticResource MemberCoefDataTemplate}" />

我需要动态地向网格添加列。作为Binding我使用索引器属性。所以我需要动态设置绑定,因为我不知道绑定到哪个索引。当我只是为了测试尝试这个

var column = new DataGridTemplateColumn();
column.CellTemplate = (DataTemplate)Application.Current.MainWindow.Resources["MemberCoefDataTemplate"];
TextBox tb = column.CellTemplate.FindName("TextBox", dg) as TextBox;

我得到了InvalidOperationException机智描述:

  

此操作仅对已应用此模板的元素有效

2 个答案:

答案 0 :(得分:0)

通常在设置时间内获取控件,您必须调用方法LoadContent();

我会尝试column.CellTemplate.LoadContent()

答案 1 :(得分:0)

您可以在他的博客上找到Josh Smith here撰写的关于您的问题(以及课程解决方案)的完整说明。

确实,这是DataGridTemplateColumn应用DataTemplate

的点
private FrameworkElement LoadTemplateContent(bool isEditing, object dataItem, DataGridCell cell)
{
    DataTemplate dataTemplate;
    DataTemplateSelector dataTemplateSelector;
    this.ChooseCellTemplateAndSelector(isEditing, out dataTemplate, out dataTemplateSelector);
    if (dataTemplate != null || dataTemplateSelector != null)
    {
        ContentPresenter contentPresenter = new ContentPresenter();
        BindingOperations.SetBinding(contentPresenter, ContentPresenter.ContentProperty, new Binding());
        contentPresenter.ContentTemplate = dataTemplate;
        contentPresenter.ContentTemplateSelector = dataTemplateSelector;
        return contentPresenter;
    }
    return null;
}

如您所见,使用了ContentPresenter