【问题标题】:WPF Nested Databinding; How Do I Bind To An Item Inside Another ItemWPF 嵌套数据绑定;如何绑定到另一个项目中的一个项目
【发布时间】:2011-08-29 16:57:09
【问题描述】:

我有一个 ListView 绑定到 CustomerContacts 的 ObservableCollection。 到目前为止它工作得很好,但是对于这方面的新手,我不知道如何做下一部分。 每个客户联系人都有几种联系人类型,我想在他们的名字下显示。

所以在 CustomerContacts 内部我有另一个 ObservableCollection 的 ContactTypes。

这是我当前的数据模板:

    <DataTemplate x:Key="iconTemplate">
        <DockPanel Height="133" Width="150">
            <Image Source="/Tracks%203.5;component/Images/NoPic.png" Height="25" Width="25" Margin="1,0" />
            <TextBlock DockPanel.Dock="Top" Text="{Binding FullName}" Margin="5,3,5,0" FontWeight="Bold" HorizontalAlignment="Left" />
            <<TextBlock Text="{Binding Title}" Margin="5,0,5,3" HorizontalAlignment="Left" />>
        </DockPanel>
    </DataTemplate>

这是我第一次尝试将列表视图放入其中:

    <DataTemplate x:Key="iconTemplate">
        <DockPanel Height="133" Width="150">
            <Image Source="/Tracks%203.5;component/Images/NoPic.png" Height="25" Width="25" Margin="1,0" />
            <TextBlock DockPanel.Dock="Top" Text="{Binding FullName}" Margin="5,3,5,0" FontWeight="Bold" HorizontalAlignment="Left" />
            <ListView ItemsSource="{Binding ContactTypes}">
                <ListView.Template>
                    <ControlTemplate TargetType="ItemsControl">
                        <ItemsPresenter/>
                    </ControlTemplate>
                </ListView.Template>
                <ListView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </ListView.ItemsPanel>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Margin="3,0,0,0" HorizontalAlignment="Center" Text="{Binding Path=ContactType}"/>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
            <!--<TextBlock Text="{Binding Title}" Margin="5,0,5,3" HorizontalAlignment="Left" />-->
        </DockPanel>
    </DataTemplate>

我想将绑定到 Title 的 TextBlock 替换为绑定到 ContactTypes 中项目的 ListView/ListBox/ItemsControl。

有点类似于这个问题:WPF: bind to a List inside a class> 但没有所有代码隐藏。将它包含在 XAML 中会很好。

【问题讨论】:

  • 你试过添加listView吗?当你尝试时发生了什么?
  • 我认为它不起作用,因为我的内部 ListView &lt;ListView ItemsSource="{Binding ContactTypes}"&gt; 实际上并没有绑定到 ObservableCollection。例如,在我的外部 Listview 中,我必须在代码隐藏Me.lstContacts.ItemsSource = contacts 中设置 ItemsSource,否则它将不起作用。我想我必须弄清楚如何将 ObservableCollection 联系人变成一个 windows 属性,也许我也必须使用内部列表视图来做到这一点?将ContactTypes 变成一个属性?

标签: wpf vb.net data-binding listview observablecollection


【解决方案1】:

我会在这里做几件事:

  1. 简化您尝试执行的操作以隔离问题。而不是整个ListView 业务,只需在其中放一个ItemsControl:&lt;ItemsControl ItemsSource="{Binding ContactTypes}" /&gt; 这将为您提供事物的默认视图,它可能只会向您显示对象的数据类型(无论 ContactTypes 是什么),但是它会让你知道绑定是否有效。如果是,您将在此处列出 something。如果不是,你就不会。

  2. 如果您没有列出任何内容,请使用 Snoop 深入了解并查找错误。 Snoop 显示数据绑定错误,允许您检查每个项目的DataContext 等。

  3. 如果您仍然遇到问题,如果您将您的类定义和代码发布在您连接的地方,我们可能会受益。可能还有其他一些潜在的问题(例如,最初发生绑定时 ContactTypes 属性是否为 null,并且您没有使用 INPC 让绑定系统知道它何时发生变化?)。

【讨论】:

  • 弄清楚为什么没有后面的代码我无法绑定。我将 ObservableCollection 声明为 Public 而不是 Property。一旦我在两个地方都这样做了,它就开始工作了。我确实将其更改为 ItemsControl 而不是 ListView,我更喜欢这样。那个 Snoop 程序也会很有趣。可能真的很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 2013-02-05
  • 1970-01-01
相关资源
最近更新 更多