3

这工作正常:

 <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>

但是,我想使用用户控件来代替堆栈面板,其中有两个 TextBlocks,使用如下:

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

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

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

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

非常感谢您对此的任何指示 - TIA

4

1 回答 1

5

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

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

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

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

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

Person person = this.DataContext as Person;
于 2009-09-11T02:46:08.523 回答