Как определить, какой элемент ListView и его URL-адрес были выбраны, когда пользователь закрепляет с BottomAppBar

У меня есть базовая программа для чтения RSS, которая отображает список сообщений блога в listView в левом столбце Grid.Column. В правом Grid.Column находится WebView. Когда пользователь выбирает элемент в listView, Webview обновляется Uri и отображает веб-страницу.

Теперь я добавил BottomAppBar и создал кнопки Pin/UnPin. Я успешно создал возможность закрепления, однако я не передаю никаких данных в строку запроса NavigationContext. Поэтому, когда пользователь нажимает на закрепленную плитку, он ссылается только на всю страницу, а не на выбранную статью. Это загружает все последние статьи, а не URL-адрес выбранного элемента.

Я знаю, что мне нужно передать URL-адрес в строку запроса закрепленной плитки, но я застрял здесь. Я делал это десятки раз в своих приложениях для Windows Phone, но я застрял здесь из-за этого приложения для Windows 8. В WP7 я использую контекстное меню для закрепления элемента. Здесь я закрепляюсь на панели приложений и не могу получить URL-адрес и добавить его в качестве строки запроса (как мой TileActivationArgument)

В основном мне нужно руководство о том, как получить данные выбранного элемента и поместить их на плитку, и как прочитать их обратно. Вот мой метод Pin():

РЕДАКТИРОВАТЬ: я пошел дальше и сделал временное рабочее решение, но оно не решает мою проблему невозможности получить свойства выбранного элемента. Комментарии встроены в код

private async void PinTileHelper(string message, object sender)
    {
        //This is my preferred method, but I cannot extract the SelectedItem's properties
        //var item = itemListView.SelectedItem;


        //I'm not able to use the sender because this is a button click
        //var selectedItem = (FeedItems)((ListView)sender).SelectedItem;

        //As a cheesy workaround, I just took the Uri directly from the WebView's source Uri
        var ActivationArgument = this.ContentView.Source.ToString();

        Uri logo = new Uri("ms-appx:///Assets/squareTile-sdk.png");
        //Uri smallLogo = new Uri("ms-appx:///Assets/smallTile-sdk.png");

        SecondaryTile secondaryTile = new SecondaryTile("Toolbox",
                                                        "Fantasy Football Tile",
                                                        "Article name goes here and ",
                                                        ActivationArgument,
                                                        TileOptions.ShowNameOnLogo,
                                                        logo);

        secondaryTile.ForegroundText = ForegroundText.Dark;
        //secondaryTile.SmallLogo = smallLogo;

        bool isPinned = await secondaryTile.RequestCreateAsync();

        MessageDialog dialog = new MessageDialog("Pinned?");

        if (isPinned)
        {
            dialog.Content = "You have succesfully pinned this tile";
            await dialog.ShowAsync();
        }
        else
        {
            dialog.Content = "Something went wrong. The tile wasn't pinned.";
            await dialog.ShowAsync();
        }
    }

Спасибо за любую информацию, которую вы можете предоставить.

РЕДАКТИРОВАТЬ № 2: Успех!! Безопасное приведение к вашим элементам ItemViewModel делает свое дело.

var item = itemListView.SelectedItem as FeedItems (or your ItemViewModel items);

person Lance McCarthy    schedule 04.09.2012    source источник
comment
Можете ли вы показать код, который вы используете для закрепления и открепления сейчас? Получить выбранный элемент из listView довольно просто (listView.selectedItem), поэтому я не уверен, что понимаю, в чем проблема.   -  person Jeff Brand    schedule 04.09.2012
comment
Я добавил код выше. Как видите, я все еще использую SDK по умолчанию DateTime для TileArgument. Что мне нужно сделать, это удерживать выбранный URL-адрес элемента ListView. Когда пользователь переходит из плитки, WebView отображает URL-адрес. Это важно, потому что список RSS-каналов будет быстро удалять сообщения. Если пользователь может закрепить определенную страницу, это делает закрепление желаемого UX.   -  person Lance McCarthy    schedule 04.09.2012
comment
Также кажется, что мне нужно захватить LaunchArgs в App.xaml.cs, а затем передать его в SplitPage.xaml (именно на него ссылается плитка). Или WinRT автоматически отправляет его на страницу с глубокими ссылками, и я могу получить TileArgument непосредственно из OnNavigatedTo e.Parameter?   -  person Lance McCarthy    schedule 04.09.2012


Ответы (1)


Попробуйте заменить

var selectedItem = (FeedItems)((ListView)sender).SelectedItem;

с участием

var selectedItem = (FeedItems)((ListView)sender).SelectedItem as FeedItem;

Я предполагаю, что это правильный тип класса для оператора as. Это позволит вам получить доступ ко всем свойствам, включая Uri, для выбранного элемента. Если selectedItem имеет значение null после этого вызова, вы не выполняете приведение к правильному типу. Приведение к соответствующему типу класса. Прямо сейчас, с кодом как есть, вы получаете старый простой объект.

Да, вы берете LaunchArgs и передаете их на целевую страницу как часть обработки начальной навигации.

person Jeff Brand    schedule 04.09.2012
comment
Безопасное приведение помогло получить объекты из моего класса, но теперь я получаю сообщение об ошибке, потому что отправителем является кнопка, а не представление списка. Мне придется сделать это как контекстное меню? - person Lance McCarthy; 05.09.2012
comment
Ха! Используя вашу идею, я сделал безопасный заброс с первой попытки, и это сработало. Итак, решение: var item = itemListView.SelectedItem as FeedItems. Я обновлю свой вопрос. Спасибо за помощь! - person Lance McCarthy; 05.09.2012