自定义WPF数据绑定:如何添加自定义逻辑?

时间:2010-04-29 09:13:37

标签: wpf data-binding viewmodel

我对一些复杂的数据绑定有疑问 我希望能够更新网格(其属性“IsItemsHost”设置为true)
动态发生数据绑定时动态 实际上我正在使用CustomControl,这是一个ItemsControl和这个 在ControlTemplate中有Grid。

更具体地说,我将网格绑定到某些项目,我想 根据这些项目更改网格行数, 添加类似标题的内容(一行包含一些文本), 并使用一些自定义逻辑设置项目'Grid.Row和Grid.Column。

应用此类行为的最简单方法是什么 每当绑定数据更新?

我是否必须使用也包含标题数据的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 个答案:

答案 0 :(得分:0)

Grid用于布局。如果某个集合中的项目数量不断变化,那么您真正想要的是ItemsControl,或更具体的ListBox(如果您想要项目选择等)。

如果您仍然需要Grid - 就像单个行的行为一样,您可能需要在Grid中定义ItemsControl.ItemTemplate并在ItemsControl处与Grid.IsSharedSizeScope一起玩水平。或者,您可以只使用ListView来获取包中的网格外观和项目选择。

答案 1 :(得分:0)

更新:我通过创建一个使用MeasureOverride和ArrangeOverride自我更新的自定义面板来实现它。这让我可以调整面板给孩子,我甚至不需要使用网格。这也使得控件看起来没有。

相关问题