WPF - 公开继承列的绑定方法

时间:2013-07-15 16:30:30

标签: wpf vb.net inheritance datagridtemplatecolumn

我遇到的一个重复出现的问题是需要为datagrids创建增强的文本列。我的意思是指的行与普通文本列一样,但具有附加图形或功能,如文本旁边显示的图像。所以我正在使用模板列,但显然这意味着必须“从头开始”生成普通文本列所需的许多功能,例如文本框编辑模板:

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

这就是我经常这样做而没有任何问题。首先,您需要在后面的代码中定义依赖项属性。 This应该告诉你如何在VB.net中做到这一点(我真的很喜欢VB.net,所以我不会假装给你任何建议)。检查VB.net中的第一个示例。您需要首先更改的是从布尔值到字符串,您可能还需要更改属性名称。小心将名称中的“属性”部分留在示例中。应将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}"/>

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