WinRT XAML数据绑定包含List的对象列表

时间:2012-09-23 16:31:59

标签: c# xaml data-binding windows-8 windows-runtime

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

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,在顶行显示City的{​​{1}},在下方显示NameListView包含ListView s(仅限Restaurant!)。 CityListViewItem显示TextBlocks的{​​{1}}。 我只希望Restaurant可以点击。

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

Name

这种方式只显示灰色框。将Restaurant的绑定更改为<!-- 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的{​​{1}} s在两种情况下均未显示。

此外,滚动在某种程度上打破了这种观点,但我认为这是一个不同的故事。

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

1 个答案:

答案 0 :(得分:1)

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

  

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

但是如果您没有明确指定它,编译器会默认处理成员"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; }
}