Wpf ListView内的UserControl数据绑定失败
我有一个自定义控件,简化如下:Wpf ListView内的UserControl数据绑定失败,wpf,listview,data-binding,user-controls,Wpf,Listview,Data Binding,User Controls,我有一个自定义控件,简化如下: <UserControl x:Class="WPF.TestControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxml
<UserControl x:Class="WPF.TestControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WPF"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<ContentPresenter Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" />
</Grid>
</UserControl>
使用方法:
<local:TestControl Grid.Row="0">
<Border BorderBrush="Red" BorderThickness="1">
<TextBlock Text="{Binding Path=Message, Mode=OneWay}"/>
</Border>
</local:TestControl>
到目前为止,一切顺利
但是,当用作ListView的DataTemplate的一部分时,绑定不再工作:
<ListView ItemsSource="{Binding Path=Items}" Grid.Row="2">
<ListView.Resources>
<DataTemplate DataType="{x:Type local:TestViewModel}">
<local:TestControl>
<TextBlock Text="{Binding Path=Message, Mode=OneWay}"/>
</local:TestControl>
</DataTemplate>
</ListView.Resources>
</ListView>
需要什么咒语才能使上述数据绑定工作?您正在创建一个无限循环。
UserControl
已经是一个ContentControl
,因为它是从它派生出来的。因此,只要不重写其ControlTemplate
,就不应该向其添加ContentPresenter
,因为它在模板中使用时绑定到TemplatedParent
这种痛苦的触发因素是TemplatedParent
绑定。TestControl
是模板的一部分。该模板应用于ListViewItem
,因此它是TestControl
的模板化父级
现在,TestControl
中ContentPresenter
的绑定源的值是ListViewItem.Content
属性的值,该属性保存TestControl
本身。通过这种方式,您可以将模板化父级ListViewItem.Content
,即TestControl
,添加到TestControl
的ContentPresenter
,该ContentPresenter现在包含相同的TestControl
(自身),它绑定了模板化父级ListViewItem.Content
,即TestControl
,到TestControl
的ContentPresenter
,它现在包含相同的TestControl
(本身),它绑定模板化的父级。。。堆栈溢出
如果您想像使用ContentControl
一样使用UserControl
,即显示其他“外部”控件的视觉效果,则可以像使用ContentCobtrol
一样使用它:
TestControl
<UserControl x:Class="TestControl">
</UserControl>
<UserControl x:Class="TestControl">
<UserControl.Template>
<ControlTemplate TargetType="local:TreeIndex">
<Border>
<Grid>
...
<ContentPresenter Content="{TemplateBinding Content}" />
</Grid>
</Border>
</ControlTemplate>
</UserControl.Template>
</UserControl>
数据模板
<DataTemplate DataType="{x:Type local:TestViewModel}">
<local:TestControl>
<TextBlock Text="{Binding Path=Message, Mode=OneWay}"/>
</local:TestControl>
</DataTemplate>
<DataTemplate DataType="{x:Type local:TestViewModel}">
<local:TestControl>
<TextBlock Text="{Binding Path=Message, Mode=OneWay}"/>
</local:TestControl>
</DataTemplate>