这是否有可能实现呢?
我有一个ListView,想为每一列创建一个模板,标记为“cellTextBox”的每个列都将显示一个文本框(并在失去焦点事件时调用TextBox_LostFocus())。我真的很想使用一个单一模板而不是为每一列都定义DockPanel和TextBox。但是,每一列将绑定到数据源中的不同列。
换句话说,我希望有一个“替身”GridViewColumn的模板,可以让我为每个列指定不同的绑定路径。
我尝试过类似于以下内容的东西(除其他事项外),但它不起作用。
您有什么想法吗?
我有一个ListView,想为每一列创建一个模板,标记为“cellTextBox”的每个列都将显示一个文本框(并在失去焦点事件时调用TextBox_LostFocus())。我真的很想使用一个单一模板而不是为每一列都定义DockPanel和TextBox。但是,每一列将绑定到数据源中的不同列。
换句话说,我希望有一个“替身”GridViewColumn的模板,可以让我为每个列指定不同的绑定路径。
我尝试过类似于以下内容的东西(除其他事项外),但它不起作用。
您有什么想法吗?
<Page.Resources>
<DataTemplate x:Key="cellTextBox">
<DockPanel>
<TextBox
LostFocus="TextBox_LostFocus"
Width="100"
Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},Path=DisplayMemberBinding}"
/>
</DockPanel>
</DataTemplate>
</Page.Resources>
<StackPanel>
<ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled"
HorizontalAlignment="Stretch"
ItemsSource="{Binding Tables[0]}"
Width="Auto"
x:Name="Service_Tasks">
<ListView.View>
<GridView>
<GridViewColumn Width="120" CellTemplate="{StaticResource cellTextBox}" DisplayMemberBinding={Binding Path=Field1} Header="Field1" />
<GridViewColumn Width="120" CellTemplate="{StaticResource cellTextBox}" DisplayMemberBinding={Binding Path=Field2} Header="Field2" />
<GridViewColumn Width="120" CellTemplate="{StaticResource cellTextBox}" DisplayMemberBinding={Binding Path=Field3} Header="Field3" />
<GridViewColumn Width="120" CellTemplate="{StaticResource cellTextBox}" DisplayMemberBinding={Binding Path=FieldN} Header="FieldN" />
<!-- ... other columns ... -->
</GridView>
</ListView.View>
</ListView>
</StackPanel>
编辑- 我认为我应该分享一下@H.B.解决方案的Visual Basic翻译,这对我很有用。也许这会帮助其他人。
Imports System.Windows.Markup
Public Class TemplateBuilderExtension : Inherits StaticExtension
Dim _path As String
Shared _tagpath As String
'Private TagPath As String
Shared Property TagPath As String
Get
TagPath = _tagpath
End Get
Private Set(ByVal value As String)
_tagpath = value
End Set
End Property
Property Path As String
Get
Path = _path
End Get
Set(ByVal value As String)
_path = value
End Set
End Property
Public Overrides Function ProvideValue(ByVal serviceProvider As System.IServiceProvider) As Object
TagPath = Path
Dim resourceExt = New StaticResourceExtension("TemplateBuilder_BaseTemplate")
'Dim baseTemplate As DataTemplate = DirectCast(resourceExt.ProvideValue(serviceProvider), DataTemplate)
ProvideValue = DirectCast(resourceExt.ProvideValue(serviceProvider), DataTemplate)
End Function
Public Sub New()
MyBase.new()
End Sub
Public Sub New(ByVal Path As String)
Me.Path = Path
End Sub
End Class
Public Class TemplateBuilderTagExtension : Inherits MarkupExtension
Public Sub New()
MyBase.New()
End Sub
Public Overrides Function ProvideValue(ByVal serviceProvider As System.IServiceProvider) As Object
ProvideValue = New Binding(TemplateBuilderExtension.TagPath)
End Function
End Class
显然,无论如何,XAML都是相同的。
不要忘记在根级标签中添加以下命名空间引用:
xmlns:me="clr-namespace:WpfApplication1"
,将WpfApplication
替换为您的应用程序的根命名空间(可以在应用程序属性中找到)。
再次感谢 @H.B.!
public string Path { get; set; }
这一行的意思是 Path 属性不会被内部存储(即 get 和 set 没有被实现)吗?还是这是默认属性实现?我更习惯 VB,虽然我做过一些基本的 C# 编程,所以我正在翻译它。 - transistor1