привязка данных в сводном элементе из 2 разных источников с использованием x:Bind

Мне нужно привязать шаблон сводного заголовка к данным Course_Tab, а шаблон внутреннего элемента gridview к данным Course_Products с помощью x:Bind. Я успешно завершил привязку шаблона сводного заголовка, но получить источник элемента для gridview было для меня немного сложно из-за некоторой ошибки шаблона данных. Вот фрагмент кода:

public ObservableCollection<CourseList> Course_Tab { get; set; }
public ObservableCollection<Productdetails> Course_Products { get; set; }


 [DataContract]
public class CourseList
{
    [DataMember]
    public int CourseID { get; set; }
    [DataMember]
    public string CourseCategoryCode { get; set; }
    [DataMember]
    public string BoardCode { get; set; }
    [DataMember]
    public string CourseCode { get; set; }
    [DataMember]
    public string CourseName { get; set; }
    [DataMember]
    public string CourseDisplayName { get; set; }
    [DataMember]
    public string CourseShortName { get; set; }
}

[DataContract]
public class Productdetails
{
    [DataMember]
    public int ProductId { get; set; }
    [DataMember]
    public string ProductCode { get; set; }
    [DataMember]
    public string ProductName { get; set; }
    [DataMember]
    public string ProductDescription { get; set; }
    [DataMember]
    public string AcademicYearCode { get; set; }
    [DataMember]
    public string SubjectName { get; set; }
    [DataMember]
    public string Product_Type { get; set; }
    [DataMember]
    public string Product_Subtype { get; set; }
    [DataMember]
    public string SDcardsize { get; set; }
    [DataMember]
    public string Duration { get; set; }
    [DataMember]
    public string Graphics { get; set; }
}


<Pivot x:Name="Pivot1" ItemsSource="{x:Bind Course_Tab}" SelectionChanged="Pivot1_SelectionChanged">
                <Pivot.HeaderTemplate>
                    <DataTemplate x:DataType="data:CourseList">
                        <TextBlock Text="{x:Bind CourseDisplayName}"/>
                    </DataTemplate>
                </Pivot.HeaderTemplate>

                <Pivot.ItemTemplate>
                    <DataTemplate>
                        <GridView ItemsSource="{x:Bind Course_Products}">
                            <GridView.ItemTemplate>
                                <DataTemplate x:DataType="data:Productdetails">
                                    <Image Source="{x:Bind Graphics}"/>
                                </DataTemplate>
                            </GridView.ItemTemplate>
                        </GridView>
                    </DataTemplate>
                </Pivot.ItemTemplate>

            </Pivot>

person Monish Koyott    schedule 16.09.2016    source источник


Ответы (1)


На самом деле вы хотите связать вложенный GridView внутри Pivot. В своем коде вы привязываете ItemsSource к элементу управления Pivot, а затем хотите привязать коллекцию к GridView, который находится внутри элемента Pivot. Таким образом, для коллекции GridView это вложенная коллекция.

Чтобы связать это, нам нужно изменить модель данных CourseList, чтобы добавить Course_Products в качестве одного из свойств CourseList следующим образом:

public class CourseList
{
   [DataMember]
   public int CourseID { get; set; }
   [DataMember]
   public string CourseCategoryCode { get; set; }
   [DataMember]
   public string BoardCode { get; set; }
   [DataMember]
   public string CourseCode { get; set; }
   [DataMember]
   public string CourseName { get; set; }
   [DataMember]
   public string CourseDisplayName { get; set; }
   [DataMember]
   public string CourseShortName { get; set; }

   public ObservableCollection<Productdetails> Course_Products { get; set; }

}

И код XAML:

<Pivot x:Name="Pivot1" ItemsSource="{x:Bind Course_Tab}" SelectionChanged="Pivot1_SelectionChanged">
    <Pivot.HeaderTemplate>
        <DataTemplate x:DataType="local:CourseList">
            <TextBlock Text="{x:Bind CourseDisplayName}"/>
        </DataTemplate>
    </Pivot.HeaderTemplate>
    <Pivot.ItemTemplate>
        <DataTemplate x:DataType="local:CourseList">
            <GridView ItemsSource="{x:Bind Course_Products}">
                <GridView.ItemTemplate>
                    <DataTemplate x:DataType="local:Productdetails">
                        <Image Source="{x:Bind Graphics}"/>
                    </DataTemplate>
                </GridView.ItemTemplate>
            </GridView>
        </DataTemplate>
    </Pivot.ItemTemplate>
</Pivot>

И образец для источника данных:

 Course_Tab = new ObservableCollection<CourseList>
 {
     new CourseList {CourseDisplayName="displayname1" ,Course_Products= new ObservableCollection<Productdetails>
     {
         new Productdetails {Graphics="Assets/caffe1.jpg" },
         new Productdetails {Graphics="Assets/caffe2.jpg" }
     }},
     new CourseList {CourseDisplayName="displayname2" ,Course_Products= new ObservableCollection<Productdetails>
     {
          new Productdetails {Graphics="Assets/caffe1.jpg" }
     }}
 };
person Sunteen Wu    schedule 19.09.2016
comment
Нельзя ли связать его без изменения модели данных CourseList. Что я хочу сделать, так это связать два очень разных источника данных без какой-либо вложенности для шаблона заголовка и элемента. - person Monish Koyott; 20.09.2016
comment
В этом случае вы можете поместить CourseList и Productdetails в один родительский источник (пусть они оба будут дочерними коллекциями родительского источника). В любом случае, ItemsSource для Pivot может быть только один. - person Sunteen Wu; 21.09.2016