2012-12-23 67 views
2

結構

該場景是我有一個樞軸,其中每個項目是某一天的菜單。在該PivotItem中,我需要在菜單上顯示菜餚,按類別分組(例如湯,甜點等)。MVVM +多級/嵌套數據綁定

我已經用MVVM模型實現了這一點。

因此,我有如下因素模型:

public class Menu{ 
    public string Date; 
    public List<DishList> Categories; 
} 
public class DishList 
{ 
    public string Category; 
    public List<Dish> Dishes; 
} 
public class Dish 
{ 
    public string Name; 
    public string Price; 
} 

編輯:這些都在這裏簡化,每個字段的實際結構是這樣的:

private string _date; 

    //Get_Set 
    public string Date 
    { 
     get 
     { 
      return _date; 
     } 
     set 
     { 
      if (value != _date) 
      { 
       _date = value; 
      } 
     } 
    } 

所以結構會是這樣:一個PivotElement包含一個Menu對象。在裏面,我展示了Categories,一些DishLists。在Dishlist中,我展示了類別和不同的菜餚,每種菜餚都有它的名稱和價格。讓事情變得更清晰的模型(SkyDrive上的pdf文件); http://sdrv.ms/12IKlWd

我有以下視圖模型

public class MenuViewModel : INotifyPropertyChanged 
{ 
    private ObservableCollection<Menu> _Menus; 
} 

的應實施(結構)所需的佈局的觀點如下:

<phone:Pivot 
     ItemsSource="{Binding Menus}"> 
     <phone:Pivot.HeaderTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Date}" /> 
      </DataTemplate> 
     </phone:Pivot.HeaderTemplate> 
     <phone:Pivot.ItemTemplate> 
      <DataTemplate> 
       <ItemsControl 
        ItemsSource="{Binding Categories}"> 
        <TextBlock 
         Text="{Binding Category}"/> 
        <ItemsControl 
         x:Name="Dishes" 
         ItemsSource="{Binding Dishes}"> 
         <ItemsControl.ItemTemplate> 
          <DataTemplate> 
           <Grid> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="300"/> 
             <ColumnDefinition Width="*"/> 
            </Grid.ColumnDefinitions> 

            <TextBlock 
             Grid.Column="1" 
             Text="{Binding Name}"/> 
            <TextBlock 
             Grid.Column="2" 
             Text="{Binding Price}"/> 
           </Grid> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
        </ItemsControl> 
       </ItemsControl> 
      </DataTemplate> 
     </phone:Pivot.ItemTemplate> 
    </phone:Pivot> 

正如你所看到的,嵌套在數據綁定獲取它所需的數據。

唯一的代碼,然後我在頁面上做的是

DataContext = App.ViewModel; 

的問題

當我啓動起來,我得到的PivotItems頭顯示正確的數據,並PivotItems的正確數量。可惜,就是這樣; PivotItem的內容保持空白。因此,第一級數據綁定工作,但沒有進一步的。

我在想

方式
  • 第一級:每個PivotItem被鏈接到類型菜單的對象,以頭Menu.Date
  • 2級:這裏面我PivotItem設置的ItemsControl的的ItemsSource到Menu.Categories
  • 3級:在現在的ItemsSource是Menu.Categories.Dishes

我已經搜查了不少撥弄與周圍的DataContext和ItemsSourc e和不同種類的「{綁定...}」,但我無法使其工作。我想在xaml中進行綁定,而不是在代碼隱藏中。

註釋
  • 唯一功能是顯示數據。數據是固定的,並從文件加載一次。 這就是爲什麼我選擇ItemsControl而不是ListBox,因此不需要選擇任何東西。
  • 這是一個MVVM的方法我剛纔的問題:Databinding + Dynamic Pivot

回答

4

首先,你要訪問的稱號私有字段,這樣將無法正常工作。這些也必須是屬性,而不是字段。

<TextBlock Text="{Binding Date}" /> 

private string Date; 

接下來你綁定到Category,它也是私有的,而不是屬性。

<TextBlock Text="{Binding Category}"/> 

private string Category; 

而且您綁定到需要屬性的類別字段。

<ItemsControl ItemsSource="{Binding Categories}"> 

public List<DishList> Categories; 

即使你糾正這些問題,你仍然不會得到你想要的東西,因爲你的外ItemsControl不具有ItemTemplate

<ItemsControl ItemsSource="{Binding Categories}"> 
    <TextBlock Text="{Binding Category}"/> 
    ... 
</ItemsControl> 

補充:你的新的錯誤是因爲,所以你需要使用一個容器像一個StackPanelDataTemplate只能有一個子元素。

<ItemsControl ItemsSource="{Binding Categories}"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="{Binding Category}"/> 
     <ItemsControl x:Name="Dishes" ItemsSource="{Binding Dishes}"> 
      ... 
     </ItemsControl> 
     </StackPanel> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

並且沒有列出請求,'ObservableCollection '是MVVM中的首選集合類型。 – user7116

+0

1.這些值實際上具有屬性而不是字段,但是我沒有在這裏鍵入它們,希望保持簡單。道歉,我用一個真實代碼中的例子來編輯帖子。 –

+0

2.我爲外部ItemsControl添加了ItemTemplate。但是,現在我在VS中發現錯誤,說「屬性VisualTree設置了多次」。是不是可以將ItemsControl放入ItemsControl中? –