私がしようとしたのはDataGridTextColumns
にDatagrid
のワードラップを適用するためにこのように明示的に設定することなくStyle
を作成することです。AttachedPropertyを介してすべての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>
DataGridTextColumn
がFrameworkElement
ではありませんので、残念ながら直接以下のようにいくつかのStyle
を使用することはできません。
<Style TargetType="{x:Type TextBlock}" x:Key="WrapText">
<Setter Property="TextWrapping" Value="Wrap"/>
</Style>
私はRayBurnsでこの回避策https://stackoverflow.com/a/2640862/5381620を発見し、それが働いているかを把握しようとしていました。しかし、私はプロパティが追加されていないので、なぜ機能していないのか理解していません。
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);
}
}
私は完全に混乱してしまったのは、スタイルセッターを見つけ出すときです。 現在、私は明らかに動作していないされ、このようにそれをしようとしているが、実際に私はこのTargetTypeが本当にどのように見えるかの手掛かりを持っていません。
<local:MyDataGridHelper.TextColumnStyle>
<Style TargetType="FrameworkElement">
<Setter Property="TextBlock.TextWrapping" Value="Wrap"/>
</Style>
</local:MyDataGridHelper.TextColumnStyle>
一つの小さな追加を。これにより、すべての列のスタイル全体がオーバーライドされます。 1つの列に個別の情報が必要な場合は、単にセッターを追加するだけです。 静的ボイドUpdateColumnStyles(データグリッドグリッド) {VAR origStyle = GetTextColumnStyle(グリッド)。 foreachの(grid.Columns.OfTypeにおけるVARカラム()){ するvar newStyle =新しいスタイル()。 newStyle.BasedOn = column.ElementStyle。 newStyle.TargetType = origStyle.TargetType; foreach(varSetter in origStyle.Setters.OfType ()) { \t newStyle.Setters.Add(setter); } column.ElementStyle = newStyle。 } } –
pedrito