我对一些复杂的数据绑定有疑问 .
我希望能够更新网格(其属性"IsItemsHost"设置为true)
每当发生数据绑定时动态地动态 .
实际上我正在使用CustomControl,这是一个ItemsControl和它
在ControlTemplate中有Grid .
更具体一点,我将网格绑定到一些项目,我想根据这些项目更改网格行的数量,添加像 Headers (一行包含一些文本),并设置项目'Grid.Row和Grid .Column使用一些自定义逻辑 .
每当绑定数据更新时,应用此类行为的最简单方法是什么?
我是否必须使用也包含 Headers 数据的viewmodel?
提前致谢 .
CustomControl Generic.xaml的代码:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TimeTableControl">
<Style TargetType="{x:Type local:TimeTableControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:TimeTableControl}">
<Border Width="Auto" Height="Auto" BorderBrush="#FF4B5A9B" BorderThickness="4" CornerRadius="4" Margin="2" Padding="0" Background="White">
<Grid Width="Auto">
<Grid.RowDefinitions>
<RowDefinition Height="0.1*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Viewbox>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DayCaption}"/>
</Viewbox>
<Border Grid.Row="1" BorderThickness="0,2,0,0" BorderBrush="#FF4B5A9B">
<Grid Name="ContentGrid" IsItemsHost="True">
</Grid>
</Border>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
2 回答
Grid
用于布局 . 如果某个集合中的项目数量有所变化,那么您真正想要的是ItemsControl
,或更具体的ListBox
(如果您想要项目选择等) .如果您仍然希望单个行的行为类似
Grid
,则可能需要在ItemsControl.ItemTemplate
中定义Grid
并在ItemsControl
级别使用Grid.IsSharedSizeScope . 或者,您可以使用ListView
来获取包中的网格外观和项目选择 .更新:我通过创建一个使用MeasureOverride和ArrangeOverride自我更新的自定义面板来实现它 . 这让我可以调整面板给孩子,我甚至不需要使用网格 . 这也使控件看起来不露面 .