2

我有一个List包含另一个的对象List。我想将两个Lists 绑定到不同的控件(一个嵌套在另一个控件中 - a ListViewas GridViewItem)。但我无法让工作。

非常接近这个问题的是Binding List of Lists in XAML? .
在 MSDN 文档中有一篇关于此的文章:
如何绑定到分层数据并创建主/详细信息视图- 可能是解决方案,但我发现很难将其应用到我的代码中。
其他文章涉及这个主题,但不是那么好,而且作为一个新用户,我不允许在一个问题中包含两个以上的超链接。

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

模型:

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与城市作为GridViewItems。在其中GridViewItem有一个,在顶行Grid显示City' ,在下面显示一个。包含s (仅那个!)。s 只显示' s 。我只希望s 可以点击。NameListViewListViewRestaurantCityListViewItemTextBlocksRestaurantNameRestaurant

像这样:
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' 绑定更改Text="{Binding}"为时,至少Name会显示 Cities 的 s。我不明白也不想要,因为我猜这些toString方法的覆盖并不意味着以这种方式使用。Names 中的sRestaurant在这两种情况下都不会出现。

此外,滚动在这个视图中以某种方式中断,但我想这是一个不同的故事。

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

4

1 回答 1

1

数据绑定引擎需要公共属性(链接是关于 WPF 但相同的概念适用于 WinRT):

您可以绑定到任何公共语言运行时 (CLR) 对象的公共属性、子属性以及索引器。

但是,如果您没有明确指定它,则编译器默认处理成员“您可以为该成员声明的最受限制的访问”,例如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; }
}
于 2012-09-23T19:03:14.040 回答