Инкапсуляция повторного макета в WPF - PullRequest
0 голосов
/ 16 декабря 2010

В табличке с данными, которую я привязываю к модели представления, у меня есть сетка примерно так:

<Grid> 
 .  
 .  <!--Row & Col Definitions...-->
 .
 <TextBlock Text="Some Label" Style="{DynamicResource TextBlockLabelStyle}" />
 <TextBlock Grid.Column="1" Text="{Binding SomeValue, Mode=OneWay}"/>
 <Border Style="{DynamicResource SeparatorStyle}" />

 <TextBlock Grid.Row="1" Text="Some Label" Style="{DynamicResource TextBlockLabelStyle}" />
 <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding SomeValue, Mode=OneWay}"/>
 <Border Grid.Row="1" Style="{DynamicResource SeparatorStyle}" />   

 <TextBlock Grid.Row="2" Text="Some Label" Style="{DynamicResource TextBlockLabelStyle}" />
 <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding SomeValue, Mode=OneWay}"/>
 <Border Grid.Row="2" Style="{DynamicResource SeparatorStyle}" />   
</Grid> 

Я думал, что добавление этого повторяющегося шаблона (TextBlock для метки, TextBlock для значения, горизонтальное правило) получалосьутомительно и подумал, что было бы лучше инкапсулировать его в UserControl что-то вроде 'GridRow', например:

<UserControl x:Class="GridRow">
  <TextBlock Text="{Binding LabelText}" Style="{DynamicResource TextBlockLabelStyle}" />
  <TextBlock Grid.Column="1" Text="{Binding ValueText, Mode=OneWay}"/>
  <Border Style="{DynamicResource SeparatorStyle}" />
</UserControl>

Тогда я мог бы просто пойти что-то вроде:

<Grid>
  <GridRow LabelText="Some Label" ValueText="{Binding SomeValue}"/>
  <GridRow Grid.Row="1" LabelText="Some Label2" ValueText="{Binding SomeValue2}"/>
  <GridRow Grid.Row="2" LabelText="Some Label3" ValueText="{Binding SomeValue3}"/>
</Grid>

и иметь пользователяконтроль связывания со свойствами LabelText и ValueText, возможно, через привязку шаблона?

Мой вопрос заключается в том, как это сделать, и если это правильный способ, или если можно использовать стили или шаблоны данных, чтобы сделатьэто?

1 Ответ

0 голосов
/ 16 декабря 2010

К сожалению, этого добиться нелегко. Макет Grid просматривает свойства Grid.Row и Grid.Column его непосредственных дочерних элементов, чтобы создать требуемый макет. Поэтому вложение элементов управления вашего пользовательского интерфейса в другую сетку нарушит макет.

Несколько вариантов, эта запись в блоге решает проблему, но является сложной:

http://www.scottlogic.co.uk/blog/colin/2010/11/using-a-grid-as-the-panel-for-an-itemscontrol/

Здесь есть хорошая Автосетка, я ее не использовал, но выглядит она неплохо:

http://whydoidoit.com/2010/10/06/automatic-grid-layout-for-silverlight/

С уважением, Колин Э.

...