Пользовательские страницы подробностей в приложении сетки Windows 8

Я создал простое приложение С# Windows 8 grid.

Если вы не знакомы с этим макетом, здесь есть краткое объяснение:

Ссылка

То, что я хотел бы иметь, просто - некоторые пользовательские ItemDetailPages. Я хотел бы иметь возможность щелкнуть некоторые элементы в GroupDetailPage и GroupedItemsPage и перейти к пользовательскому файлу .xaml, в котором я могу включить более одного изображения.

Я уверен, что есть простой способ сделать то, что я пропустил, и я также уверен, что эта информация будет полезна для многих людей, поэтому я буду предлагать щедрость по этому вопросу.

Я изо всех сил старался сделать это до сих пор:

Я создал CustomDataItem в классе SampleDataSource.cs:

 /// <summary>
    /// Generic item data model.
    /// </summary>
    public class CustomDataItem : SampleDataCommon
    {
        public CustomDataItem(String uniqueId, String title, String subtitle, String imagePath, String description, String content, SampleDataGroup group)
            : base(uniqueId, title, subtitle, imagePath, description)
        {
            this._content = content;
            this._group = group;
        }

        private string _content = string.Empty;
        public string Content
        {
            get { return this._content; }
            set { this.SetProperty(ref this._content, value); }
        }

        private SampleDataGroup _group;
        public SampleDataGroup Group
        {
            get { return this._group; }
            set { this.SetProperty(ref this._group, value); }
        }
    }

Однако, очевидно, добавив к ObservableCollection

private ObservableCollection<SampleDataGroup> _allGroups = new ObservableCollection<SampleDataGroup>();
public ObservableCollection<SampleDataGroup> AllGroups
{
    get { return this._allGroups; }
}

невозможно с другим типом данных. Итак, что я могу сделать в этом случае?

Большое спасибо.

Ответ 1

У меня есть простое приложение сетки; как я могу связать один из элементов на странице страницы элемента группы с страницей детализации пользовательского элемента?

Итак, откройте приложение, которое создается при использовании шаблона "Grid App" из Visual Studio.

Класс данных для элементов на странице элементов группы - это класс SampleDataItem. Вы можете добавить некоторый тип поля данных (bool, int или другой), который указывает, как обрабатывать навигацию. В этом примере мы сохраняем его простым, поэтому мы добавляем bool, чтобы указать, является ли таможня обычаем или нет.

public class SampleDataItem : SampleDataCommon
{
    // add flag as last param
    public SampleDataItem(String uniqueId, String title, String subtitle, 
        String imagePath, String description, String content, SampleDataGroup group, 
        bool isCustomNav = false)
    : base(uniqueId, title, subtitle, imagePath, description)
    {
        this._content = content;
        this._group = group;
        this.IsCustomNav = isCustomNav;
    }

    // to keep it simple this doesn't handle INotifyPropertyChange, 
    // as does the rest of the properties in this class.
    public bool IsCustomNav { get; set; }

    ...
}

Поэтому, когда вы добавляете новый объект SampleDataItem, который должен отображаться, вам просто нужно установить поле isCustomNav в конструкторе.

Теперь все, что нам нужно сделать, это изменить уже существующий обработчик события кликов в сетке на сгруппированной странице позиций (GroupedItemsPage.xaml.cs):

void ItemView_ItemClick(object sender, ItemClickEventArgs e)
{
    // Navigate to the appropriate destination page, configuring the new page
    // by passing required information as a navigation parameter
    var item = (SampleDataItem)e.ClickedItem;
    var itemId = item.UniqueId;

    if (item.IsCustomNav == false)
    {
        // default
        this.Frame.Navigate(typeof(ItemDetailPage), itemId);
    }
    else
    {
        // custom page
        this.Frame.Navigate(typeof(ItemDetailPage2), itemId);
    }
}

Все, что мы делаем выше, это получение выбранного элемента, а затем тестирование флага навигации, добавленного нами ранее. Исходя из этого, мы переходим либо к исходному ItemDetailPage, либо к новому, называемому ItemDetailPage2. Как я уже упоминал ранее, флаг навигации не должен быть bool. Это может быть int или enum или какой-либо другой тип, который сообщает нам, куда перемещаться.

Обратите внимание, что если вы хотите подобное поведение в GroupDetailsPage, вам просто нужно обновить обработчик события click там же.

Надеюсь, что это поможет.

Ответ 2

Да, вы должны иметь возможность создать пользовательский или другой тип данных. Если вы создаете приложение Win8 с использованием шаблона сетки, вы увидите, что шаблон делает три вещи для вас: 1) Он создает три типа: SampleDataCommon, который является базовым, SampleDataItem, который реализует SampleDataCommon и добавляет два новых свойства - контент и группу, а SampleDataGroup, который также реализует SampleDataCommon, добавляет метод ItemsCollectionChanged и добавляет два свойства: Items и TopItems, 2) Он создает класс SampleDataSource, в котором создается коллекция SampleDataGroup и называется AllGroups: ObservableCollection AllGroups. 3) Он связывает элементы и AllGroups объекта SampleDataSource с объектами на страницах XMAL.

В вашем случае вы используете ту же структуру данных. Другими словами, вы создадите группу с элементами и т.д.