【问题标题】:WPF - expose binding methods for inherited columnWPF - 公开继承列的绑定方法
【发布时间】:2013-07-13 14:34:28
【问题描述】:

我经常遇到的一个问题是需要为数据网格创建增强的文本列。我的意思是列的作用就像普通的文本列,但带有额外的图形或功能,比如在文本旁边显示的图像。所以我正在使用模板列,但显然这意味着必须“从头开始”生成许多普通文本列所期望的功能,例如文本框编辑模板:

<DataGridTemplateColumn.CellEditingTemplate>
         <DataTemplate>
              <TextBox 
                   FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}" 
                    Text="{Binding Path=[binded text], Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/>

我想定义一个从 DataGridTemplateColumn 继承的列,然后将所有这些代码转储到其中,这样我就可以在任何我希望的数据网格中重用这些列。但如上所示,我不能在类定义中声明绑定,因为这显然取决于使用情况。

如何定义一个继承的数据网格列,该列使用子控件(在这种情况下特别是单元格编辑文本框),但当列已用 xaml 声明时,仍然允许为这些控件设置绑定一些实际的数据网格?

到目前为止,我已经尝试公开一种方法来执行此操作,但它不起作用:

Public Class MyTextColumn
Inherits DataGridTemplateColumn
....
Public Property EditorBinding As String
    Get....
    Set(value As String)
        Dim b As New Binding(value)
        b.Mode = BindingMode.TwoWay
        b.UpdateSourceTrigger = UpdateSourceTrigger.LostFocus
        Dim tb = DirectCast(Me.CellEditingTemplate.LoadContent, TextBox)
        tb.SetBinding(TextBox.TextProperty, b)
    End Set
End Property

不工作,我最好的猜测是我没有设置Binding.Source,但我不知道应该设置什么。越来越令人沮丧了。

【问题讨论】:

    标签: wpf vb.net inheritance datagridtemplatecolumn


    【解决方案1】:

    因此,如果我理解正确,您希望能够将 TextBox 的文本属性绑定到父控件上的某个内容,该父控件将保存您的这个子控件。你不能使用普通属性来做到这一点(我猜你得到了“无法绑定,因为它不是依赖属性”异常或类似的东西)。

    这就是我通常没有任何问题的方式。首先你需要在后面的代码中定义一个依赖属性。 This 应该告诉你如何在 VB.net 中做到这一点(我真的很讨厌 VB.net,所以我不会假装给你任何建议)。检查 VB.net 中的第一个示例。您首先需要更改的是从 Boolean 到 String,您可能还想更改属性名称。请注意将名称的“属性”部分保留在示例中的位置。 GetType(MyCode) 应更改为您正在实现依赖属性的类的名称(您的 MyTextColumn 类的名称)

    在 MyTextColumn xaml 中,它应该如下所示:

    <DataGridTemplateColumn.CellEditingTemplate>
             <DataTemplate>
                  <TextBox 
                       FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}" 
                        Text="{Binding Path=IsSpinning, RelativeSource={RelativeSource AncestorType=DataGridTemplateColumn}, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/>
    

    我已经输入了原始属性名称 IsSpinning,您应该将您选择的名称放在那里。此外,如果基类不是 DataGridTemplateColumn,您可能必须修复相对源。这应该会接收到您的自定义控件的任何内容。

    最后一步是使用你的控件:

    <controls:MyTextColumn IsSpinning="{binding PropName}"/>
    

    你基本上将它绑定到你想要的任何字符串。随意写下您对我的解释或代码可能遇到的任何问题,我会相应地修复我的答案。

    【讨论】:

    • 很抱歉尚未回复您的回答。我的手指韧带撕裂了,这个月没能写太多代码 :( 运气好的话,我可以在不久的将来检查一下。
    • 我很抱歉,但我没有让这个工作。也许您可以发布完整的列定义?明确地说,我希望“IsSpinning”绑定到每一行源对象的属性。
    猜你喜欢
    • 2017-01-25
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 2018-02-10
    相关资源
    最近更新 更多