为什么不结束这个问题?
请不要关闭问题:suggested link不包含答案,因为DataGridTemplateColumn
中没有Binding
属性,我找不到将数据绑定到它的方法。
似乎可以在数据模板中使用Text={Binding}
,这是答案的“一半”
原题
我是WPF的新手。
我有一个DataGrid
,我想有一些列的特定模板,但所有的模板是相同的。
比如说
<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<!-- first column is a standard column, ok-->
<DataGridTextColumn Header="First Column" Binding="{Binding FirstColumn}"/>
<!-- a few of the other columns use a custom template-->
<DataGridTemplateColumn Header="Second Column">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding SecondColumn, UpdateSourceTrigger=PropertyChanged}"/
<OtherThings />
<OtherThings />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<More Columns Exactly like the above, with different bindings/>
<!-- Column3 Binding={Binding Column3}-->
<!-- Column4 Binding={Binding Column4}-->
</DataGrid.Columns>
</DataGrid>
如何以一种可以设置模板绑定的方式将模板创建为静态资源?
我尝试创建一个静态资源,如
<DataTemplate x:Key="ColumnTemplate">
<TextBox Text={I have no idea what to put here}/>
<OtherThings/>
<OtherThings/>
<DataTemplate>
然后用它就像
<DataGrid>
<DataGrid.Columns>
<!-- Where does the Header go?, where does the binding go?-->
<!-- binds to column 2-->
<DataGridTemplateColumn CellTemplate="{StaticResource ColumnTemplate}">
<!-- binds to column 3-->
<DataGridTemplateColumn CellTemplate="{StaticResource ColumnTemplate}">
</DataGrid.Columns>
</DataGrid>
但我真的不知道如何使绑定正确地从项目到模板内的文本框。
我如何才能做到这一点?
2条答案
按热度按时间2skhul331#
原则上,你可以这么做,但这是否是一个好计划还有待商榷。
您可以更改单元格模板,用其他标记包围列绑定到的任何内容,这似乎是您想要的。
这里有一些微妙之处,如果你允许在数据网格中编辑,数据网格会将单元格的内容从文本块切换到文本框。这对于除了琐碎需求之外的任何事情都是不可取的--但这可能是另一个主题。
在datagrid或父资源中:
然后,您可以将其应用于列:
正如我上面提到的,当你点击单元格编辑它时,很可能会发生奇怪的事情,你可能也希望代码关注contentpresenter中的文本框。
如果您想减少重复代码,则可以使用xamlreader使用模板动态构建列。
如果你只是有可能3列是相同的,那么这可能是矫枉过正,但它将在很大程度上复制粘贴。
我创建了一个示例来说明这一点:
https://social.technet.microsoft.com/wiki/contents/articles/28797.wpf-dynamic-xaml.aspx#Awkward_Bindings_Data
https://gallery.technet.microsoft.com/WPF-Dynamic-XAML-Awkward-41b0689f
该示例生成月份数据的移动选择。
相关代码在主窗口
txt文件包含列的所有“标准”标记。然后将其作为xml进行操作以替换值。
然后使用XAMLReader.parse将结果转换为WPFUI对象
再来一次
对于只有几列的需求,可能设计得太过了。
bq3bfh9z2#
此模板是可重用的,TextBox.Text属性绑定到列绑定的文本。