2

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

<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,但我不知道我应该设置它。它变得非常令人沮丧。

4

1 回答 1

0

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

这就是我通常没有任何问题的方式。首先你需要在后面的代码中定义一个依赖属性。应该向您展示如何在 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}"/>

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

于 2013-10-02T14:49:50.800 回答