WPF:ItemsControl datatemplate作为用户控件的问题

3 data-binding wpf user-controls itemscontrol

这很好用:

 <ItemsControl ItemsSource="{Binding Persons}">
   <ItemsControl.ItemsPanel>
     <ItemsPanelTemplate>
       <StackPanel Orientation="Vertical" />
     </ItemsPanelTemplate>
   </ItemsControl.ItemsPanel>
   <ItemsControl.ItemTemplate>
     <DataTemplate>
       <StackPanel Orientation="Horizontal">
         <TextBlock Text="{Binding Path=FirstName}"/>
         <TextBlock Text="{Binding Path=LastName}"/>
       </StackPanel>
     </DataTemplate>
   </ItemsControl.ItemTemplate>
 </ItemsControl>
Run Code Online (Sandbox Code Playgroud)

但是,我想使用User Control代替带有两个TextBlocks的堆栈面板,使用类似的东西:

  <DataTemplate>
    <jasControls:NameView/>
  </DataTemplate>
Run Code Online (Sandbox Code Playgroud)

但是,有了这个和一百万个其他语法,NameView什么也没显示,但它在ItemsControl之外的单独测试中工作正常,具有显式设置(依赖)属性 - 例如

  <jasControls:NameView FName="{Binding Path=Person.FirstName}"  />
Run Code Online (Sandbox Code Playgroud)

我几乎找不到任何这方面的例子,并且需要知道如何指定用户控件的属性 - 或者用户如何控制'接收'单个项类型(Person)?使用什么语法?我需要指定数据类型吗?ItemsControl是否会导致问题,或者任何类似的控件是否会导致例如ListBox?我可以设计它以便用户控件获取整个Person对象吗?我在用户控件中需要哪些依赖属性?总之,如何将数据导入用户控件?!涉及的实际业务类型将涉及用户控件中的一些逻辑,因此我需要使用用户控件.

非常感激地接受任何方向 - TIA

And*_*mes 5

假设您的Persons集合中包含许多Person对象,则控件的DataContext属性NameView将自动设置为该Person对象.

您不需要任何依赖属性来实现此壮举.您的NameView用户控件只是:

<UserControl ...>
   <StackPanel Orientation="Horizontal">
      <TextBlock Text="{Binding FirstName}"/>
      <TextBlock Text="{Binding LastName}"/>
   </StackPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

您应该没有代码隐藏来显示此信息.

从那里,您应该能够从DataContext属性访问Person对象:

Person person = this.DataContext as Person;
Run Code Online (Sandbox Code Playgroud)