Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf ListView内的UserControl数据绑定失败_Wpf_Listview_Data Binding_User Controls - Fatal编程技术网

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>