WPF:ItemsControl 数据模板作为用户控件的问题

标签 wpf data-binding 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>

但是,我想使用一个用户控件来代替带有两个 TextBlock 的堆栈面板,使用类似的东西:

  <DataTemplate>
    <jasControls:NameView/>
  </DataTemplate>

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

  <jasControls:NameView FName="{Binding Path=Person.FirstName}"  />

我在任何地方都找不到这方面的例子,并且需要知道如何指定用户控件的属性 - 或者用户控件如何“接收”单个项目类型(一个人)?使用什么语法?我需要指定数据类型吗? ItemsControl 是否导致了问题,或者任何类似的控件是否应该导致问题,例如列表框?我可以设计它以便用户控件获得整个 Person 对象吗?用户控件中需要哪些依赖属性?简而言之,如何将数据获取到用户控件中?!实际涉及的业务类型会更复杂一些,涉及用户控件中的一些逻辑,因此我希望使用用户控件。

非常感谢收到有关此的任何指示 - TIA

最佳答案

假设您的 Persons 集合中有许多 Person 对象,您的 NameView 控件的 DataContext 属性将自动设置为 Person 对象。

您不需要任何依赖属性即可实现这一壮举。您的 NameView 用户控件将只是:

<UserControl ...>
   <StackPanel Orientation="Horizontal">
      <TextBlock Text="{Binding FirstName}"/>
      <TextBlock Text="{Binding LastName}"/>
   </StackPanel>
</UserControl>

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

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

Person person = this.DataContext as Person;

关于WPF:ItemsControl 数据模板作为用户控件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1408708/

相关文章:

c# - TextBox 更改未保存到 DataTable

c# - 如何在 ASP.NET 页面上使用子类控件?

wpf - 如何为用户控件创建 MVVM 而不将所有内部结构暴露给消费者?

wpf - 如何以编程方式将新元素停靠到 DockPanel

c# - 为 Windows Store App 定制的虚拟键盘

wpf - 如何将图像 "placemarkers"放在 WPF 中的滚动条内?

c# - WPF TextBox EventTrigger 事件序列

wpf - 从用户控件绑定(bind)到父用户控件的属性

java - 在 TextField 中输入任何文本时在 Label 中显示文本

c# - 如何将用户定义的数据类型对象绑定(bind)到 DetailsView?