如何解决具有相同自定义模板/样式但绑定/上下文不同的多个DataGrid列
我想创建一个自定义DataGrid
列(或DataGridCell
样式),最好在XAML中使用它,并多次使用它,而无需任何代码重复。它应该包含多个不同的控件,每个控件都访问数据对象的不同属性。
似乎有两种方法可以做到这一点:
-
DataGridTemplateColumn
和自定义CellTemplate
(请参阅an example here) - 自定义
DataGridCell
样式(类似于this或this)
这两种解决方案都存在相同的问题。为内部控件指定绑定时,它们似乎总是与整个DataGrid
行相关,而不是与单元格相关。
DataGridTemplateColumn
没有Binding
属性,因此其CellTemplate
绑定到整行,因此无法将同一模板用于多列,每列都访问不同的属性行对象。
类似地,我可以通过DataGridTextColumn
(参见here)以覆盖Template
的样式访问{TemplateBinding Content}
的内容,但是我找不到访问方法内容的属性,所以我认为这是不可能的。
以下是此类DataGrid
的虚拟示例,以说明我的情况:
public class Name
{
public string First { get; set; }
public string Last { get; set; }
public override string ToString() => $"{First} {Last}";
}
public class Team
{
public Name First { get; set; }
public Name Second { get; set; }
public Name Third { get; set; }
}
public ObservableCollection<Team> DataList { get; } = new ObservableCollection<Team>();
<DataGrid ItemsSource="{Binding DataList}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="First" Binding="{Binding First}"/>
<DataGridTextColumn Header="Second" Binding="{Binding Second}"/>
<DataGridTextColumn Header="Third" Binding="{Binding Third}"/>
</DataGrid.Columns>
</DataGrid>
现在,我想分离First
的{{1}}和Last
属性,并使用单独的控件来渲染它们,这两个控件仍在同一Name
单元内。例如,这里的动机可能是将DataGrid
设为黑色,将First
设为红色,或者其他要求它们位于两个单独控件中的内容。
Last
的示例(在DateTemplate
上用作CellTemplate
):
DataGridTemplateColumn
<DataTemplate x:Key="NameTemplate">
<StackPanel>
<Label Content="{Binding First}"/>
<Label Content="{Binding Last}"/>
</StackPanel>
</DataTemplate>
样式的示例(在DataGridCell
上用作CellStyle
):
DataGridTextColumn
有什么办法可以使类似于以上示例的代码正常工作?
当然,可以为每个列复制粘贴相同的模板/样式,每个模板/样式都访问<Style x:Key="NameStyle" TargetType="{x:Type DataGridCell}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<DockPanel>
<ContentPresenter Content="{Binding First}"/>
<ContentPresenter Content="{Binding Last}"/>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
的相关行级属性,但这是一个可怕的解决方案,对于维护,只是无法扩展。
我已经看到了一些类似的问题,但是没有一个问题的XAML解决方案并不十分复杂。这看起来似乎很容易做到,但是我无法在任何地方找到简单的解决方案。我发现的最相似的问题可能是this,但从未真正以对我的情况有帮助的方式回答。
对于build and apply the XAML code (template/style) at runtime或to add an attached property to the column,有两种可能的解决方案,它们使我可以分别传递属性。在我看来,这两个都是骇人听闻的骇客,我更希望避免使用它们。另一个解决方案是创建一个从Name
(例如here)派生的新控件(如建议的this),但我对此也很走运,与之相比,这是一个相当复杂的解决方案定义一个DataGridBoundColumn
。
PS::在完成问题并寻找其他问题和答案的链接时,我偶然发现了the DataGridBoundTemplateColumn
implementation,该方法很有效,但我仍然会宁愿使用仅使用模板/样式的XAML本地解决方案,而不是创建仍然需要模板本身的新控件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。