我有List
个包含另一个List
的对象。我想将List
绑定到不同的控件(一个嵌套在另一个控件中 - ListView
为GridViewItem
)。但我无法让xaml工作。
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}},在下方显示Name
。 ListView
包含ListView
s(仅限Restaurant
!)。 City
仅ListViewItem
显示TextBlocks
的{{1}}。
我只希望Restaurant
可以点击。
像这样:
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中的数据绑定有什么问题?
答案 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; }
}