在WPF中封装重复布局

时间:2010-12-16 10:45:46

标签: wpf binding datatemplate

在我绑定到viewmodel的datatemplate中,我有一个像这样的网格:

<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 :(得分:0)

不幸的是,这是不容易实现的。 Grid布局查看其直接子项的Grid.Row和Grid.Column属性,以便创建所需的布局。因此,将UI控件嵌套在另一个Grid中会破坏布局。

一些选项,这篇博客文章解决了这个问题,但很复杂:

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/

此致 科林E.