У меня есть несколько FlowDocument
s, у всех них есть таблица. Все таблицы выглядят одинаково.
Таким образом, я хочу осуществить рефакторинг FlowDocument
s.
Мой первоначальный документ похож:
<FlowDocument xmlns=...>
<Table>
<Table.Columns>
<TableColumn Width="12*" />
<TableColumn Width="1.5*" />
<TableColumn Width="2*" />
<TableColumn Width="*" />
<TableColumn Width="2*" />
<TableColumn Width="*" />
</Table.Columns>
<TableRowGroup>
<TableRow>
<TableCell>Some content...</TableCell>
...
</Table>
</FlowDocument>
Я ищу что-то как:
<FlowDocument xmlns=...>
<FlowDocument.Resources>
<Style TargetType="{x:Type Table}">
<Setter Property="ColumnsDefinition">
<Setter.Value>
<ControlTemplate>
<TableColumn Width="12*" />
<TableColumn Width="1.5*" />
<TableColumn Width="2*" />
<TableColumn Width="*" />
<TableColumn Width="2*" />
<TableColumn Width="*" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</FlowDocument.Resources>
<Table>
<TableRowGroup>
<TableRow>
<TableCell>Some content...</TableCell>
...
</Table>
</FlowDocument>
Но к сожалению Таблица FlowDocuments не имеет свойства Template
.
К сожалению, свойство Columns является свойством коллекции только для чтения, поэтому вы можете добавить к нему в XAML, но не можете установить его из Setter. Один из способов решения этой проблемы - создать присоединенное свойство, которое можно установить, а затем передать значения из присоединенного свойства в коллекцию. Например:
public static class TableBehavior
{
public static readonly DependencyProperty AttachedColumnsProperty =
DependencyProperty.RegisterAttached(
"AttachedColumns",
typeof(IEnumerable<TableColumn>),
typeof(TableBehavior),
new PropertyMetadata(AttachedColumnsChangedCallback));
public static void SetAttachedColumns(Table element, IEnumerable<TableColumn> value)
{
element.SetValue(AttachedColumnsProperty, value);
}
public static IEnumerable<TableColumn> GetAttachedColumns(Table element)
{
return (IEnumerable<TableColumn>)element.GetValue(AttachedColumnsProperty);
}
private static void AttachedColumnsChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var table = d as Table;
if (table != null)
{
table.Columns.Clear();
foreach (var column in (IEnumerable<TableColumn>)e.NewValue)
{
table.Columns.Add(column);
}
}
}
}
А затем в XAML:
<FlowDocument.Resources>
<Style TargetType="Table">
<Setter Property="local:TableBehavior.AttachedColumns">
<Setter.Value>
<x:Array Type="TableColumn">
<TableColumn Width="12*" />
<TableColumn Width="1.5*" />
<TableColumn Width="2*" />
<TableColumn Width="*" />
<TableColumn Width="2*" />
<TableColumn Width="*" />
</x:Array>
</Setter.Value>
</Setter>
</Style>
</FlowDocument.Resources>