【问题标题】:how to create binding in code when the datatemplate is declared in xaml在 xaml 中声明数据模板时如何在代码中创建绑定
【发布时间】:2011-09-07 15:06:26
【问题描述】:

我有一个在 xaml 中声明的数据模板。
例如

    <DataTemplate x:Key="TestTemplate">
        <StackPanel>
            <TextBox Name="txtBox"  Visibility="Visible"></TextBox>                
        </StackPanel>             
    </DataTemplate>

我希望在生成元素之前在后面的代码中设置 txtBox 的绑定,因为我对生成的不同元素有不同的绑定路径

我可以在后面的代码中获取模板:

DataTemplate tmplt = FindResource("TestTemplate") as DataTemplate;

但我不确定下一步该做什么。如何获取 txtBox 引用来设置绑定。

【问题讨论】:

    标签: c# wpf data-binding


    【解决方案1】:

    我们必须记住一件事,模板不是实例化的 UI 控件。它们是 XAML 中的流式对象,并在 UI 元素之间共享。因此,如果您编辑 dataTemplate 并更改其结构(通过添加、编辑、删除模板下的元素),它将更改在控件之间共享的一个数据模板。因此,使用该模板的其他元素也将受到更改的影响。

    现在让我们解决您向文本框添加动态出价的问题。你说每个生成的文本框都会有不同的绑定路径。所以这绝对不需要改变数据模板本身!

    在生成文本框后,您必须访问文本框并为其添加动态绑定。

    我看到您的绑定根据您的“情况”而有所不同,那么为什么不能使用 TemplateSelector?模板选择器将在运行时决定哪个数据模板(有一个特定的绑定应用到 TetxBox)。

    【讨论】:

    • 好吧!!!我同意你说的。但这并不能解决我的问题。实际问题是我必须显示一个网格。网格的单元格可以是文本框,也可以是在运行时知道的组合框。此外,网格的列可以在运行时更改。我有复制和粘贴列的要求。为此,我创建了一个单元格模板。以及我希望在运行时执行的文本框-> 文本或组合框-> itemsource 的绑定。由于最大列数最多可达 100,因此我不希望为相同的内容编写不同的模板。
    【解决方案2】:

    答案的第一部分 - 是FindName() 方法。

    示例:

    DataTemplate tmplt = FindResource("TestTemplate") as DataTemplate;
    TextBox my = (TextBox)tmplt.FindName("txtBox");
    

    试试这个,它应该有助于访问TextBox 控件。我想你知道如何绑定到。如果您希望您的 DataBinding 表现不同,请使用 MultiBindingConverter

    编辑

    public class GeneralObject
    {
        private object someObject;
        public GeneralObject(object initObject)
        {
            this.someObject = initObject;
        }
    
        //If you want to bind to some text, for example
        public string Text
        {
            get
            {
                //I think you know which objects are coming as input
                if (this.someObject is SpecialClass1)
                    return ((SpecialClass1)this.someObject).SpecialClass1TextProperty;
                if (this.someObject is SpecialClass2)
                    return ((SpecialClass2)this.someObject).SpecialClass2TextProperty;
                //and so on.
            }
        }
    
    }
    

    编辑 2 另一种可能的方法

    所以我记得,WPF 有ContentControl

    <ContentControl Content="{Binding Path=CurrentObject}"/>
    

    但在这种情况下,您必须为一个班级创建多个DataTemplate,每个Template

    <DataTemplate DataType="{x:Type local:SpecialClass1}">
        ...
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:SpecialClass2}">
        ...
    </DataTemplate>
    <!--and so on-->
    

    WPF 解析DataTypesContentControl.Content 属性,并放到ContentControl 右边DataTemplate

    【讨论】:

    • 我认为 FindName 只有当我们已经生成了元素并且我们将模板化的父级作为参数传递给函数时才会有帮助。我的要求是在使用数据模板生成元素之前设置绑定。
    • 您可以将您的对象包装到 1 个通用对象中,这些对象将具有相同名称的属性并为您的 DataTemplate 提供所需的数据。查看答案编辑。
    • 感谢您的回答。我已经想到了这些解决方法。但后来我只是想知道是否有任何可能的方法来编辑已经在 XAML 中声明的数据模板。
    • 答案是什么?有可能吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多