3

템플릿 기반 및 데이터 바인딩 된 Pivot에 PivotItem을 동적으로 추가하는 데 문제가 있습니다.데이터 바인딩 + 동적 피벗

사용중인 클래스 (빨리 이해할 수 있도록 단순화 된 비트);

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

메뉴 개체 목록을 표시하려면 피벗을 사용하고 싶습니다. 해당 목록의 항목 수를 기반으로 PivotItem을 동적으로 만듭니다. 따라서 각 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> 

나는 다음과 같이 드 .cs 파일의 피벗을 채울 : 나는 메뉴 객체로의 DataContext를 설정으로

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

이 (XAML을 통해) 데이터 바인딩이 더 이상 코드를 필요가 없습니다 여기 (그래서 나는 생각하니?).

지금 문제가 있습니다. 작동하지 않습니다 ...

디버거를 살펴볼 때 생성 된 PivotItem은 Mainpivot에서 정의한 템플릿처럼 작동하지 않습니다 (또는 생각합니다). Mainpivot을 보면 PivotItems가 추가되었다는 것을 보여 주지만, 그게 전부입니다. 그들은 null PivotItems 만 비어있는 것 같습니다. 에뮬레이터에서 실행할 때 빈 Pivot을 보여줍니다.

의견이 있으십니까?

// PS : 초보자를 개념으로 생각하면 ViewModels를 사용하지 않습니다. 나는 그 문제와 관련이 있다고 생각하지 않는다.

답변

4

여기 몇 가지가 있습니다. 먼저 바인딩을 사용하려면 필드 대신 속성을 사용해야합니다. BTW

Mainpivot.ItemsSource = List_Menus; 

- 당신이 정말로 MVVM 학습에 보일 것입니다 : 대신 피벗에 항목을 추가하여 foreach 루프의

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; }  
} 

다음으로, 단지 항목 소스를 설정합니다. 그것은 시간 가치가있다.

+0

foreach 루프 대신 ItemsSource를 변경하면 작업을 수행했습니다. 감사합니다! 클래스는 이미 입력 한 것과 정확히 같았지만 읽는 것이 더 쉽다고 생각되는 정보는 생략되었습니다. 고맙습니다! MVVM 모델에 관해서는; 그것은 분명히 내가 들어갈 수있는 일이지만 초보자로서 먼저 일하는 것을 얻은 다음 작업 기반을 얻은 후에는 필요한 곳을 개선하는 것이 더 즐겁다 고 느낍니다. –