Windows Phone Silverlight - кнопка установки IsDisabled, если связанная длина данных равна 0 - PullRequest
0 голосов
/ 09 февраля 2011

Вот что у меня есть - я пишу приложение, которое, помимо прочего, читает RSS-канал для получения эпизодов определенного подкаста, а затем отображает название и описание каждого эпизода с «прослушиванием» и «просмотром» кнопка. Но не во всех эпизодах есть обе опции - RSS будет возвращать пустую строку вместо URL для любой опции, если она недоступна. Поэтому я пытаюсь использовать IValueConverter, к которому я могу привязать IsDisabled, который возвращает true, если длина связанных данных равна 0, и false в противном случае. Сейчас я просто тестирую его на кнопках «смотреть», так как привязка для кнопок «прослушивания» будет практически одинаковой.

Фрагмент MainPage.xaml.cs:

using System.Xml.Linq;
using System.Windows.Data;
namespace appname
{
    public partial class MainPage : PhoneApplicationPage
    {
        public MainPage()
        {
            InitializeComponent();
            WebClient PodcastListDownloader = new WebClient();
            PodcastListDownloader.DownloadStringCompleted += new DownloadStringCompletedEventHandler(PodcastListDownloadCompleted);
            PodcastListDownloader.DownloadStringAsync(new Uri("http://domain.tld/mobile_app/podcastfeed"));
        }
        void PodcastListDownloadCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
                return;
            XElement xmlPodcastList = XElement.Parse(e.Result);
            PodcastListBox.ItemsSource = from PodcastEpisode in xmlPodcastList.Descendants("item")
                                   select new PodcastItem
                                   {
                                       title = PodcastEpisode.Element("date").Value + " " + PodcastEpisode.Element("title").Value,
                                       subtitle = PodcastEpisode.Element("subtitle").Value,
                                       description = PodcastEpisode.Element("summary").Value,
                                       audio = PodcastEpisode.Element("audio").Value,
                                       video = PodcastEpisode.Element("video").Value,
                                   };
        }
        private void PlayPodcast(object sender, RoutedEventArgs e)
        {
            Button btn = (Button)sender;
            Microsoft.Phone.Tasks.MediaPlayerLauncher PodcastPlay = new Microsoft.Phone.Tasks.MediaPlayerLauncher();
            PodcastPlay.Media = new Uri(btn.Tag.ToString());
            PodcastPlay.Show();
        }
}
public class PodcastItem
{
    public string title { get; set; }
    public string description { get; set; }
    public string audio { get; set; }
    public string video { get; set; }
    public string subtitle { get; set; }
}
public class StringLengthVisibilityConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null || value.ToString().Length == 0)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Фрагмент MainPage.xaml:

<phone:PhoneApplicationPage 
x:Class="CCoFnow.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800" 
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait"  Orientation="Portrait"
shell:SystemTray.IsVisible="False">

<Grid x:Name="LayoutRoot" Background="Transparent">
    <!--Panorama control-->
    <controls:Panorama Title="AppName">
        <controls:Panorama.Background>
            <ImageBrush ImageSource="PanoramaBackground.png"/>
        </controls:Panorama.Background>
        <controls:PanoramaItem Header="Podcast" Foreground="{StaticResource PhoneAccentBrush}">
            <ListBox Margin="0,0,-12,0" ItemsSource="{Binding Items}" Name="PodcastListBox">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Margin="0,0,0,17" Width="432">
                            <TextBlock Text="{Binding title}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                            <TextBlock Text="{Binding description}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                            <StackPanel Orientation="Horizontal">
                                <Button Content="Listen" Width="215" Tag="{Binding audio}" Click="PlayPodcast"/>
                                <Button Content="Watch" Width="215" Tag="{Binding video}" Click="PlayPodcast" IsEnabled="{Binding video, Converter={StringLengthVisibilityConverter}}"/>
                            </StackPanel>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </controls:PanoramaItem>
    </controls:Panorama>
</Grid>
</phone:PhoneApplicationPage>

Но отладчик выдает две ошибки:

1) Тег 'StringLengthVisibilityConverter' делает не существует в пространстве имен XML «http://schemas.microsoft.com/winfx/2006/xaml/presentation

2) Тип StringLengthVisibilityConverter был не найдено. Убедитесь, что вы не отсутствует сборка и что все ссылочные сборки были построены

Вместо этого я установил для преобразователя значение {StaticResource StringLengthVisibilityConverter} (для http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter(v=VS.95).aspx),, и теперь есть только одна ошибка: ресурс «StringLengthVisibilityConverter» не может быть разрешен. С помощью этой ошибки я могу отладить (запустить) код , но все кнопки «смотреть» остаются включенными.

Так что я предполагаю, что я называю это в неправильном пространстве имен, но я не могу понять, правильное ли. Может кто-нибудь указать мне правильное направление?

Спасибо!

Редактировать: В процессе создания этого я понял, что мне нужно сделать это по-другому - теперь у канала есть дополнительные значения, к которым я могу привязать данные. Тем не менее, я вполне уверен, что в будущем мне понадобятся эти функции, поэтому я все равно опубликую их. Если есть простое решение для этого вопроса, пожалуйста, дайте мне знать, чтобы я мог учиться и делать это успешно в следующий раз!

1 Ответ

1 голос
/ 09 февраля 2011

То, как вы ссылаетесь на конвертер, не совсем верно. Вам нужен экземпляр конвертера, доступный где-то, например в разделе Resources страницы:

<phone:PhoneApplicationPage xmlns:conv="namespace reference for your converter goes here"
                               ...>
    <phone:PhoneApplicationPage.Resources>
        <conv:StringLengthVisibilityConverter x:Key="Length" />
    </phone:PhoneApplicationPage.Resources>

Затем вы ссылаетесь на этот конвертер, используя ссылку StaticResource с x:Key, который вы дали конвертеру.

<Button Content="Watch" 
        Width="215"
        Tag="{Binding video}"
        Click="PlayPodcast"
        IsEnabled="{Binding video, Converter={StaticResource Length}}"/>

Я оставлю обсуждение вашего подхода против использования команд и MVVM на другой день:)

...