【问题标题】:Set DataTemplate control property binding to the item from an ItemsSource collection?将 DataTemplate 控件属性绑定到 ItemsSource 集合中的项目?
【发布时间】:2011-07-20 18:33:43
【问题描述】:

我有一个 ItemsCountrol,它的 ItemsSource 属性绑定到 ObservableCollection。我有一个显示这种类型的用户控件(TeamUserControl)。我创建了一个数据模板,它为 itemssource 集合中的每个 customtype 项加载此用户控件。此时,我在 TeamUserControl 中所做的任何 Binding 语句都可以通过路径 {Binding Path=TeamOwner} 直接引用 Team 属性并起作用。有没有办法绑定对用户控件所代表的 ItemsSource 项的引用?例如,在 TeamUserControl 中创建 Team 类型的依赖属性,并将其绑定到 ItemsSource 中的项目实例。

    <ItemsControl Name="ItemCtrl" Grid.Row="0" ItemsSource="{Binding Path=League.Teams}">
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <mycontrols:TeamUserControl AttachedTeam="{Binding ???}" TeamOwnerName="{Binding Path=TeamOwner}"/>
        </DataTemplate> 
      </ItemsControl.ItemTemplate>
    </ItemsControl>

在这个例子中,窗口代表一个“联赛”类,它具有以下属性: ObservableCollection 团队。还有一个“团队”类,它具有以下属性:TeamOwner。 TeamUserControl 有两个依赖属性:Team 类型的 AttachedTeam 和字符串类型的 TeamOwnerName。

我包含了 team-owner 属性引用,以表明每个用户控件都有一个 Team 实例。我只是不确定如何引用它。

【问题讨论】:

    标签: wpf datatemplate itemtemplate itemssource


    【解决方案1】:

    据我了解,你应该写

    <mycontrols:TeamUserControl AttachedTeam="{Binding}" TeamOwnerName="{Binding Path=TeamOwner}"/>
    

    {Binding} 语句将绑定到 ItemsSource 中的当前项目,其中类型 T 是您的 ObservableCollection&lt;T&gt; League.Teams 使用的类型。

    我还建议您阅读有关 ItemsControl 的 MSDN 文章,并查看 Binding 以自己清楚,您可以绑定到什么。

    【讨论】:

    • 这就是我认为它应该工作的方式。但是,我在尝试在 TeamUserControl 的源类型和目标类型 Team 之间进行转换时遇到绑定错误。由于 ItemsSource 是一个 OC,这个错误让我完全困惑。退一步说,如果我没有定义 ItemsControl.ItemsTemplate,我只会得到一个类名“Team”。我试图告诉每个类 Team 对象,使用这个 TeamUserControl 用户控件。
    • 是的,你是对的。事实证明,在我的 TeamUserControl 中,我(用于调试)将 DataContext 设置为 (DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}"),这使我的所有 Window 绑定语句都能按预期工作。我删除了它,一切都很好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多