在WPF中封装重复布局

在WPF中封装重复布局,wpf,binding,datatemplate,Wpf,Binding,Datatemplate,在绑定到viewmodel的datatemplate中,我有如下网格: <Grid> . . <!--Row & Col Definitions...--> . <TextBlock Text="Some Label" Style="{DynamicResource TextBlockLabelStyle}" /> <TextBlock Grid.Column="1" Text="{Binding SomeValue, Mode

在绑定到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,水平规则)会变得单调乏味,并认为最好将其封装到类似“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属性,或者通过模板绑定


我的问题是如何做到这一点,以及这是否是正确的方法,或者是否可以使用样式或数据模板来做到这一点?

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

有几个选项,这篇博文解决了这个问题,但很复杂:

这里有一个很好的自动栅格,我没有用过,但看起来很不错:

问候,,
科林E.

嗯,它不必在网格内。我可以很容易地把它们放在一个垂直的堆叠面板上。我只想找到一种方法,将常用的Label/Value/Separator UI元素分解出来,但能够对它们进行参数化。PS这些属性不是集合的一部分,它们只是viewmodel上的属性,我想以类似的方式显示。哦,我明白了。我认为您必须修改视图模型,将这些重复属性包装到单个类中,然后从当前视图模型中公开这些属性的集合。然后可以将其绑定为ItemsControl的ItemsSource,ItemControl.ItemTemplate描述如何呈现每个项。