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

Posted

技术标签:

【中文标题】自定义 WPF 数据绑定:如何添加自定义逻辑?【英文标题】:Customize WPF databinding: How to add custom logic? 【发布时间】:2011-02-13 17:30:53 【问题描述】:

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

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

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

我必须使用还包含标题数据的视图模型吗?

提前致谢。

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>

【问题讨论】:

【参考方案1】:

更新:我通过创建一个使用 MeasureOverride 和 ArrangeOverride 进行自我更新的自定义面板来实现它。这让我可以将面板调整为孩子,我什至不需要使用网格。这也使控件看起来不美观。

【讨论】:

【参考方案2】:

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

如果您仍希望单个行具有类似Grid 的行为,您可能需要在ItemsControl.ItemTemplate 中定义Grid,并在ItemsControl 级别使用Grid.IsSharedSizeScope。或者,您也可以只使用 ListView 来获取包中的网格外观和项目选择。

【讨论】:

实际上我使用的是一个 CustomControl,它是一个 ItemsControl,它的 ControlTemplate 中有网格。很抱歉没有提到这一点。但是,我的一个问题是我无法向此网格添加标题,因为它是数据绑定的,因此更改行定义会产生异常......但我会查看 IsSharedSizeScope-Property,感谢您指出这一点。跨度> 嗯,填补空白并猜测所有缺失的部分有点困难。最好能发布一些代码/XAML 来查看。顺便说一句,ItemsControl 有一个 ItemsPanel 属性,所以如果你想要更改底层面板,就没有必要搞乱ControlTemplateGrid 虽然很特别,但根据您的具体要求,最佳解决方案可能与您当前的解决方案完全不同。

以上是关于自定义 WPF 数据绑定:如何添加自定义逻辑?的主要内容,如果未能解决你的问题,请参考以下文章

WPF 数据绑定 - “自定义类型描述符”示例

如何在自定义 wpf 控件上绑定数据网格列的可见性?

WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件)对象绑定

带有自定义列的 WPF 数据网格绑定

wpf 重新加载自定义控件出现异常

WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件)