gpt4 book ai didi

wpf - 为什么我无法设置 DataGridTextColumn 的样式?

转载 作者:行者123 更新时间:2023-12-02 17:22:08 27 4
gpt4 key购买 nike

我尝试使用以下代码为 DataGridTextColumn 创建样式

<Style TargetType="{x:Type DataGridTextColumn}">
...
</Style>

但是,Visual Studio 2010 用蓝线突出显示 {x:Type DataGridTextColumn} 并详细说明:调用目标已引发异常。

为什么会发生这种情况以及如何解决它?

最佳答案

您无法设置 DataGridTextColumn 的样式,因为 DataGridTextColumn 不是从 FrameworkElement(或 FrameworkContentElement)派生的。仅 FrameworkElement 等支持样式。

当您尝试在 XAML 中为任何不是 FrameworkElementFrameworkContentElement 的类型创建样式时,您会收到该错误消息。

你如何解决这个问题?与任何问题一样,有志者事竟成。在这种情况下,我认为最简单的解决方案是为 DataGrid 创建一个附加属性来分配 DataGridColumn 样式:

<DataGrid ...>
<local:MyDataGridHelper.TextColumnStyle>
<Style TargetType="FrameworkElement">
... setters here ...
</Style>
</local:MyDataGridHelper.TextColumnStyle>
...

实现将遵循以下原则:

public class MyDataGridHelper : DependencyObject
{
// Use propa snipped to create attached TextColumnStyle with metadata:
... RegisterAttached("TextColumnStyle", typeof(Style), typeof(MyDataGridHelper), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
{
var grid = (DataGrid)obj;
if(e.OldValue==null && e.NewValue!=null)
grid.Columns.CollectionChanged += (obj2, e2) =>
{
UpdateColumnStyles(grid);
}
}
}
private void UpdateStyles(DataGrid grid)
{
var style = GetTextColumnStyle(grid);
foreach(var column in grid.Columns.OfType<DataGridTextColumn>())
foreach(var setter in style.Setters.OfType<Setter>())
if(setter.Value is BindingBase)
BindingOperations.SetBinding(column, setter.Property, setter.Value);
else
column.SetValue(setter.Property, setter.Value);
}
}

其工作方式是,每当附加属性发生更改时,都会为网格上的 Columns.CollectionChanged 事件添加一个处理程序。当 CollectionChanged 事件触发时,所有列都会使用设置的样式进行更新。

请注意,上面的代码不能处理优雅地删除并重新添加样式的情况:注册了两个事件处理程序。对于一个真正强大的解决方案,您需要通过添加另一个包含事件处理程序的附加属性来解决此问题,以便事件处理程序可以取消注册,但出于您的目的,我认为这并不重要。

这里的另一个警告是,直接使用 SetBinding 和 SetValue 将导致 DependencyProperty 的 BaseValueSource 为 Local 而不是 DefaultStyle。这可能对你的情况没有什么影响,但我想我应该提到它。

关于wpf - 为什么我无法设置 DataGridTextColumn 的样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2630292/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com