在WPF中封装重复布局
在绑定到viewmodel的datatemplate中,我有如下网格:在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
<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描述如何呈现每个项。