【问题标题】:How do I bind a listview to my very nested object?如何将列表视图绑定到我非常嵌套的对象?
【发布时间】:2016-02-24 17:08:59
【问题描述】:

我在将我的 ListView DataTemplate 绑定到具有非常嵌套的属性的 observablecollection 时遇到问题。 我尝试使用{Binding Trip.LegList.Leg.name} 进行绑定,但这不起作用。绑定这样的东西最简单的方法是什么?

_currentTripDataObservableCollection 类型的 Trip

<ListView Name="ui_tripview_triplist"
                  ItemsSource="{Binding _currentTripData}">
           <ListView.ItemTemplate>
               <DataTemplate>
                   <TextBlock>
                       <Run Text="{Binding Trip.LegList.Leg.name}" />
                   </TextBlock>

               </DataTemplate>
           </ListView.ItemTemplate> 
        </ListView>

这就是我首先尝试绑定它的方式,但没有成功。这是我正在使用的类(从 JSON 转换而来)。

public class Leg
{
    public Origin Origin { get; set; }
    public Destination Destination { get; set; }
    public Stops Stops { get; set; }
    public string name { get; set; }
}

public class LegList
{
    public List<Leg> Leg { get; set; }
}


public class Trip
{
    public List<ServiceDay> ServiceDays { get; set; }
    public LegList LegList { get; set; }
}

这有点乱,但那是我被赋予使用的对象......

【问题讨论】:

  • 因为LegList.Leg.name 不会退出。 LegList&lt;Leg&gt;,而不是 Leg,所以没有 name 属性

标签: c# wpf xaml listview win-universal-app


【解决方案1】:

有几个问题:

1) 您正在绑定到一个 ObservableCollection 旅行,因此您不需要在绑定中引用 Trip。您已经处于每个项目的旅行上下文中。

2) LegList.Leg 是一个没有名称属性的List。您可以添加一个嵌套的 ListView 并将 ItemSource 绑定到 LegList.Leg(即{Binding LegList.Leg})。然后绑定到每个Legname

<ListView Name="ui_tripview_triplist"
                  ItemsSource="{Binding _currentTripData}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ListView ItemsSource="{Binding LegList.Leg}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <TextBlock>
                            <Run Text="{Binding name}" />
                        </TextBlock>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        <DataTemplate>
    </ListView.ItemTemplate> 
</ListView>

【讨论】:

  • 这确实给了我一个列表,但是名称绑定仍然不起作用,调试时似乎在列表中找不到名称。
  • 你能在嵌套的ListView中试试&lt;TextBlock Text="{Binding name}" /&gt;
  • Tovbin 的回答是对的,但有一点错误。第二个ListView 没有添加&lt;ListView.ItemTemplate&gt;。添加后,它运行良好。
  • 感谢 Jayden,复制/粘贴错误。我更新了我的答案。
【解决方案2】:

LegList 是一个列表,因此无法绑定到 Trip.LegList.Leg.name。例如,在您的情况下,工作将是 Trip.LegList.Leg[0].name。但我认为这不是你想要的。

我认为你想做的是: 将 ListView 的 ItemsSource 设置为 _currentTripData.LegList 并将 Run 的 Binding 设置为 Text={Binding name}

【讨论】:

  • 将 ItemSource 设置为 _currentTripData.LegList 不起作用,因为它仍然希望我使用索引来选择哪条腿....所以我必须写 _currentTripData[0].LegList.. 但我的目的是在 ListView 中列出所有公共汽车,因此绑定到一个 LegList 对我来说不起作用......我非常坚持这一点,我已经连续三天试图弄清楚......我处于一个艰难的补丁中现在哈哈。
  • 使用 _currentTripData.SelectMany(d => d.LegList) 来获取数据的平面列表怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多