3

テンプレート化されたデータバインドされたピボットに PivotItem を動的に追加する際に問題があります。

使用中のクラス (すぐに理解できるように少し簡略化しています);

class Menu {
    string Name
    List<Dish> Dishes_1;
    List<Dish> Dishes_2;
    List<Dish> Dishes_3;    
}
class Dish {
    string Description
    string Price;     
}

ピボットを使用して、メニュー オブジェクトのリストを表示したいと考えています。そのリスト内のアイテムの数に基づいて動的に PivotItems を作成します。したがって、各 PivotElement は同じレイアウトに従い、同じように動作する必要があります。レイアウト テンプレートとデータ バインディングは、次のように .xaml で行われます。

    <phone:Pivot x:Name="Mainpivot">
        <phone:Pivot.HeaderTemplate>
          <DataTemplate>
            <TextBlock Text="{Binding Name}" />
          </DataTemplate>
        </phone:Pivot.HeaderTemplate>    
        <phone:Pivot.ItemTemplate>
           <DataTemplate>
                <ListBox>

                    <TextBlock Text="Dishes_1"/>
                    <ListBox ItemsSource="{Binding Dishes_1}">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Grid>
                                    <TextBlock Text="{Binding Description}"/>
                                    <TextBlock Text="{Binding Price}"/>
                                </Grid>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>

                   // ...
                   // this is repeated 3 times; 
                   //a textblock and listbox per List<Dishes> in the Menu-class

                </ListBox>
            </DataTemplate>
        </phone:Pivot.ItemTemplate>
    </phone:Pivot>

Pivot in de .cs ファイルに次の情報を入力します。

foreach (Menu m in List_Menus) {
    PivotItem p = new PivotItem();
    p.DataContext = m;
    Mainpivot.Items.Add(p);
}

DataContext を Menu-Object として設定すると、(xaml を介した) DataBinding は、ここでこれ以上コードを必要としないはずです (そう思いますか?)。

問題は今です。うまくいかない...

デバッガーで見ると、作成された PivotItem は Mainpivot で定義されたテンプレートのように動作しないようです (またはそう思います)。Mainpivot を見ると、Pivo​​tItems が追加されていることがわかりますが、それだけです。すべて空の PivotItems が空のだけだと思います。エミュレーターで実行すると、空のピボットが表示されるだけです。

何かご意見は?

//PS: ViewModel は (初心者にとって) 概念としてかなり混乱するので、使用しません。私はそれが問題とは何の関係もないと思いますか?

4

1 に答える 1

4

ここでいくつかのこと。まず、バインディングを機能させるには、フィールドの代わりにプロパティを使用する必要があります。

public class Menu {
    public string Name {get;set;}
    public List<Dish> Dishes_1 { get; set; }
    public List<Dish> Dishes_2 { get; set; }
    public List<Dish> Dishes_3 { get; set; }   
}

public class Dish {
    public string Description { get; set; }
    public string Price { get; set; }     
}

次に、アイテムをピボットに追加する foreach ループの代わりに、アイテム ソースを設定するだけです。

Mainpivot.ItemsSource = List_Menus;

ところで-MVVMの学習を実際に検討する必要があります。時間をかける価値があります。

于 2012-12-22T18:34:04.070 に答える