別のをList
含むオブジェクトがありますList
。List
両方を異なるコントロールにバインドしたい(一方が他方の中にネストされている-a ListView
as GridViewItem
)。しかし、 xamlを機能させることができません。
この質問に非常に近いのは、XAMLのリストのバインドリストですか?。
また、MSDNドキュメントにこれに関する記事があります。
階層データにバインドしてマスター/詳細ビューを作成する方法が解決策になる可能性がありますが、コードに適用するのは難しいと思います。
他の記事はこのトピックに触れていますが、それほど良くはありません。また、新しいユーザーとして、質問に3つ以上のハイパーリンクを含めることは許可されていません。
私のコードは次のようになります(わかりやすくするために都市/レストランのシナリオに変更):
モデル:
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
sとして持ちたいです。1つには、GridViewItem
があり、一番上の行と下の行に「」Grid
が表示されます。にはsが含まれます(そののみ!)。sは'sのみを表示しています。sだけをクリックできるようにしたい。City
Name
ListView
ListView
Restaurant
City
ListViewItem
TextBlocks
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
都市のsが表示されます。toString
メソッドのオーバーライドはこのように使用されることを意図していないと思うので、私は理解していませんし、また望んでいません。のName
sは、Restaurant
どちらの場合も表示されません。
また、このビューではスクロールがどういうわけか壊れましたが、それは私が思うに別の話です。
だから:XAMLのデータバインディングの何が問題になっていますか?