Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过AttachedProperty设置所有DataGridTextColumns的样式_C#_Wpf_Wpfdatagrid_Attached Properties - Fatal编程技术网

C# 通过AttachedProperty设置所有DataGridTextColumns的样式

C# 通过AttachedProperty设置所有DataGridTextColumns的样式,c#,wpf,wpfdatagrid,attached-properties,C#,Wpf,Wpfdatagrid,Attached Properties,我试图做的是创建一个样式,在Datagrid中的所有DataGridTextColumns上应用换行符,而不显式地这样设置 <DataGrid ItemsSource="{Binding Lines}"> <DataGrid.Columns> <DataGridTextColumn Header="Column1" Binding="{Binding Path=Result1}"> <DataGridTex

我试图做的是创建一个
样式
,在
Datagrid
中的所有
DataGridTextColumns
上应用换行符,而不显式地这样设置

<DataGrid ItemsSource="{Binding Lines}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Column1" Binding="{Binding Path=Result1}">
            <DataGridTextColumn.ElementStyle>
                <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="TextWrapping" Value="Wrap"/>
                </Style>
            </DataGridTextColumn.ElementStyle>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>
我找到了RayBurns的解决方案,并试图弄清楚它是如何工作的。然而,我对附加属性是新手,因此不理解它为什么不起作用

c代码似乎还可以

public class MyDataGridHelper : DependencyObject
{
    private static readonly DependencyProperty TextColumnStyleProperty = DependencyProperty.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);
                };
        }
    });

    public static void SetTextColumnStyle(DependencyObject element, Style value)
    {
        element.SetValue(TextColumnStyleProperty, value);
    }
    public static Style GetTextColumnStyle(DependencyObject element)
    {
        return (Style)element.GetValue(TextColumnStyleProperty);
    }

    private static void UpdateColumnStyles(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, (BindingBase)setter.Value);
                else
                    column.SetValue(setter.Property, setter.Value);
    }
}
公共类MyDataGridHelper:DependencyObject
{
私有静态只读DependencyProperty TextColumnStypeProperty=DependencyProperty.RegisterAttached(“TextColumnStyle”、typeof(Style)、typeof(MyDataGridHelper)、new PropertyMetadata
{
PropertyChangedCallback=(对象,e)=>
{
var grid=(DataGrid)obj;
如果(e.OldValue==null&&e.NewValue!=null)
grid.Columns.CollectionChanged+=(obj2,e2)=>
{
UpdateColumnStyles(网格);
};
}
});
公共静态void SetTextColumnStyle(DependencyObject元素,样式值)
{
SetValue(TextColumnStyleProperty,value);
}
公共静态样式GetTextColumnStyle(DependencyObject元素)
{
return(Style)element.GetValue(TextColumnStyleProperty);
}
私有静态void UpdateColumnStyles(DataGrid网格)
{
var style=GetTextColumnStyle(网格);
foreach(grid.Columns.OfType()中的var列)
foreach(style.Setters.OfType()中的var setter)
if(setter.Value为BindingBase)
BindingOperations.SetBinding(列,setter.Property,(BindingBase)setter.Value);
其他的
column.SetValue(setter.Property,setter.Value);
}
}
我完全搞不懂的是,当我们开始找出风格设定者的时候。 目前我正在尝试这种方式,这显然不起作用,但实际上我不知道这个targettype应该是什么样子

<local:MyDataGridHelper.TextColumnStyle>
    <Style TargetType="FrameworkElement">
        <Setter Property="TextBlock.TextWrapping" Value="Wrap"/>
    </Style>
</local:MyDataGridHelper.TextColumnStyle>

您应该将列的
ElementStyle
设置为附加属性的值:

public class MyDataGridHelper : DependencyObject
{
    private static readonly DependencyProperty TextColumnStyleProperty = 
        DependencyProperty.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);
                };
        }
    });

    public static void SetTextColumnStyle(DependencyObject element, Style value)
    {
        element.SetValue(TextColumnStyleProperty, value);
    }
    public static Style GetTextColumnStyle(DependencyObject element)
    {
        return (Style)element.GetValue(TextColumnStyleProperty);
    }

    private static void UpdateColumnStyles(DataGrid grid)
    {
        var style = GetTextColumnStyle(grid);
        foreach (var column in grid.Columns.OfType<DataGridTextColumn>())
            column.ElementStyle = style;
    }
}
公共类MyDataGridHelper:DependencyObject
{
私有静态只读DependencyProperty TextColumnStyleProperty=
DependencyProperty.RegisterAttached(“TextColumnStyle”、typeof(Style)、typeof(MyDataGridHelper)、new PropertyMetadata
{
PropertyChangedCallback=(对象,e)=>
{
var grid=(DataGrid)obj;
如果(e.OldValue==null&&e.NewValue!=null)
grid.Columns.CollectionChanged+=(obj2,e2)=>
{
UpdateColumnStyles(网格);
};
}
});
公共静态void SetTextColumnStyle(DependencyObject元素,样式值)
{
SetValue(TextColumnStyleProperty,value);
}
公共静态样式GetTextColumnStyle(DependencyObject元素)
{
return(Style)element.GetValue(TextColumnStyleProperty);
}
私有静态void UpdateColumnStyles(DataGrid网格)
{
var style=GetTextColumnStyle(网格);
foreach(grid.Columns.OfType()中的var列)
column.ElementStyle=样式;
}
}
用法:

<DataGrid>
    <local:MyDataGridHelper.TextColumnStyle>
        <Style TargetType="TextBlock">
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="TextWrapping" Value="Wrap"/>
        </Style>
    </local:MyDataGridHelper.TextColumnStyle>
    ...
</DataGrid>

...

一个小的添加。这将覆盖所有列的整个样式。如果一个列应该有一些单独的信息,我们可以这样做,只添加setter。静态void UpdateColumnStyles(DataGrid网格){var origStyle=GetTextColumnStyle(网格);foreach(grid.Columns.OfType()中的var column){var newStyle=newStyle();newStyle.BasedOn=column.ElementStyle;newStyle.TargetType=origStyle.TargetType;foreach(origStyle.Setters.OfType()中的var setter){newStyle.Setters.Add(setter);}column.ElementStyle=newStyle;}
<DataGrid>
    <local:MyDataGridHelper.TextColumnStyle>
        <Style TargetType="TextBlock">
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="TextWrapping" Value="Wrap"/>
        </Style>
    </local:MyDataGridHelper.TextColumnStyle>
    ...
</DataGrid>