2

別のをList含むオブジェクトがありますListList両方を異なるコントロールにバインドしたい(一方が他方の中にネストされている-a ListViewas GridViewItem)。を機能させることができません。

この質問に非常に近いのは、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私は都市をGridViewItemsとして持ちたいです。1つには、GridViewItemがあり、一番上の行と下の行に「」Gridが表示されます。にはsが含まれます(そののみ!)。sは'sのみを表示しています。sだけをクリックできるようにしたい。CityNameListViewListViewRestaurantCityListViewItemTextBlocksRestaurantNameRestaurant

このような:
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都市のsが表示されます。toStringメソッドのオーバーライドはこのように使用されることを意図していないと思うので、私は理解していませんし、また望んでいません。のNamesは、Restaurantどちらの場合も表示されません。

また、このビューではスクロールがどういうわけか壊れましたが、それは私が思うに別の話です。

だから: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 に答える