gpt4 book ai didi

c# - WinRT XAML 数据绑定(bind)包含列表的对象列表

转载 作者:太空宇宙 更新时间:2023-11-03 13:54:54 24 4
gpt4 key购买 nike

我有一个 List 对象,其中包含另一个 List。我想将两个 List 绑定(bind)到不同的控件(一个嵌套在另一个控件中 - ListView 作为 GridViewItem)。但我无法获得 去工作。

非常接近这个问题 Binding List of Lists in XAML? .
在 MSDN 文档中有一篇关于此的文章:
How to bind to hierarchical data and create a master/details view - 可能是解决方案,但我发现很难将其应用到我的代码中。
其他文章涉及这个主题,但不是很好,而且作为新用户,我不允许在一个问题中包含两个以上的超链接。

我的代码看起来与此类似(为清楚起见更改为城市/餐厅场景):

型号:

public class City
{
string Name { get; set; }
List<Restaurant> RestaurantList { get; set; }
//.. also a constructor with parameters for the properties and an overriding toString method that returns Name
}
public class Restaurant
{
string Name { get; set; }
List<Uri> UriList { get; set; }
//.. also a constructor with parameters for the properties and an overriding toString method that returns Name
}

代码隐藏(LoadState 方法):

    //.. getting a List of cities (with restaurants), that is being created in some model class
this.DefaultViewModel["Items"] = Cities;

有些人改为设置 DataContext。我从 MSDN 教程中得到了这个,到目前为止它一直有效。但我不确定哪个“更好”。

好了,现在是 XAML:

我想要一个 GridView,其中城市作为 GridViewItem。在一个 GridViewItem 中有一个 Grid,在顶行显示 CityName 和一个 下面的 ListViewListView 包含 Restaurant(仅包含 City!)。 ListViewItem 只是显示 RestaurantNameTextBlocks。我只希望 Restaurant 可以点击。

像这样:
http://imageshack.us/a/img687/5576/listviewasgridviewitem.png

<!-- the following line is at the very top and the reason why it should work without setting DataContext explicitly -->
DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"
<!-- ... -->
<GridView Grid.Row="1" ItemsSource="{Binding Items}" SelectionMode="None">
<GridView.ItemTemplate>
<DataTemplate>
<Grid Height="500" Width="200" Margin="50" Background="Gray">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="5*"/>
</Grid.RowDefinitions>
<TextBlock TextWrapping="Wrap" Text="{Binding Name}"/>
<ListView
Grid.Row="1"
ItemsSource="{Binding RestaurantList}" IsItemClickEnabled="True">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" Tapped="Restaurant_Click"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>

这种方式只显示灰色框。当将 TextBlock 的绑定(bind)更改为 Text="{Binding}" 时,至少会显示城市的 Name。我不明白,也不想要,因为我猜 toString 方法的重写不应该以这种方式使用。 RestaurantName 在这两种情况下都不会出现。

另外,滚动在这个 View 中以某种方式中断,但我想这是另一回事。

那么:XAML 中的数据绑定(bind)有什么问题?

最佳答案

数据绑定(bind)引擎需要public properties (该链接是关于 WPF 但相同的概念适用于 WinRT):

You can bind to public properties, sub-properties, as well as indexers, of any common language runtime (CLR) object.

但如果您不明确指定它,编译器默认会处理成员 "the most restricted access you could declare for that member"例如private 在你的情况下。

因此您需要将您的属性声明为public:

public class City
{
public string Name { get; set; }
public List<Restaurant> RestaurantList { get; set; }
}

public class Restaurant
{
public string Name { get; set; }
public List<Uri> UriList { get; set; }
}

关于c# - WinRT XAML 数据绑定(bind)包含列表的对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12554062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com