2012-04-13 4 views
0

Я только недавно начал работать над приложением, которое отображает кучу xml-данных в listBox, но проблема заключается не в том, что каждый элемент xml имеет дочернее значение (в моей проблеме, загрузка), поэтому его код listBox не должен отображаться.Windows Phone 7 Dynamic ListBox Template

Пример:

<item> 
    <id>1</id> 
    <body>Some text</body> 
    <upload></upload> 
    <created>Some text</created> 
</item> 

Я получаю данные и заполнение мой список таким образом:

var data = from query in loadedData.Descendants("item") 
        select new droppedItem 
        { 
         Id = (int)query.Element("id"), 
         Body = (string)query.Element("body"), 
         Upload = (string)query.Element("upload"), 
         Created = (DateTime)ConvertFromUnixTimestamp((double)query.Element("created")) 
        }; 
     userDrops.ItemsSource = data; 

И мой XAML выглядит следующим образом:

<ListBox Margin="0,0,-12,0" Name="userDrops"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Margin="0,0,0,17" Width="432"> 
          <RichTextBox> 
           <Paragraph> 
            <Run Text="{Binding Body}" FontSize="25" FontFamily="Segoe WP"></Run> 
           </Paragraph> 
           <Paragraph> 
            <Hyperlink NavigateUri="{Binding Upload}" TargetName="_blank" FontSize="25" FontFamily="Segoe WP">{Binding Upload}</Hyperlink> 
           </Paragraph> 
           <Paragraph> 
            <Run Text="{Binding Created}" FontFamily="Segoe WP SemiLight"></Run> 
           </Paragraph> 
          </RichTextBox> 
         </StackPanel> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

То, что я хочу do отображает только абзац, содержащий информацию о загрузке, если ребенок загрузки xml имеет значение. В противном случае просто удалите его из списка. Однако я не могу понять, как изменить основной шаблон списка.

Любая помощь будет замечательной!

+0

значит ли вы, если Загрузить пуст, вы хотите, чтобы скрыть всю 'StackPanel'? –

+0

Нет, я имею в виду, если загрузка пуста, я хочу скрыть '' (Абзац, содержащий значение загрузки) –

+0

Если загрузка пустая, она ничего не отобразит, правильно? –

ответ

0

Как насчет использования TextBlocks для отображения тела и его создания? Средняя часть будет RichTextBox, вы можете использовать конвертер видимости для переключения скрыть/показать, если загрузка пуста.

Необходимо включить ваш конвертер в вашей странице XAML первое,

xmlns:converters="clr-namespace:xxx.Converters;assembly=xxx" 

<converters:VisibilityConverter x:Key="visibilityConverter" /> 

затем использовать его в шаблоне,

   <StackPanel Margin="40,237,8,326" Width="432" Grid.Row="1"> 
        <RichTextBox> 
         <Paragraph> 
          <Run Text="{Binding Body}" FontSize="25" FontFamily="Segoe WP"></Run> 
         </Paragraph> 
        </RichTextBox> 
        <RichTextBox Visibility="{Binding Upload, Converter={StaticResource VisibilityConverter}}"> 
         <Paragraph> 
          <Hyperlink NavigateUri="{Binding Upload}" TargetName="_blank" FontSize="25" FontFamily="Segoe WP">{Binding Upload}</Hyperlink> 
         </Paragraph> 
        </RichTextBox> 
         <TextBlock Text="{Binding Created}" FontFamily="Segoe WP SemiLight"/> 
       </StackPanel> 

Преобразователь должен быть чем-то вроде этого,

public class VisibilityConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      bool visible = true; 

      if (value is bool) 
      { 
       visible = (bool)value; 
      } 
      else if (value is int || value is short || value is long) 
      { 
       visible = 0 != (int)value; 
      } 
      else if (value is float || value is double) 
      { 
       visible = 0.0 != (double)value; 
      } 
      else if (value is string) { 
       visible = ((string)value).Length > 0; 
      } 
      else if (value == null) { 
       visible = false; 
      } 

      if ((string)parameter == "!") 
      { 
       visible = !visible; 
      } 

      return visible ? Visibility.Visible : Visibility.Collapsed; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

Дополнительную информацию о конверторе величин см. В разделе this.

UPDATE

В вашем App.xaml, сделать это,

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:sg="http://schemas.stargategroup.com.au/2010/xaml/presentation" 
      xmlns:converters="clr-namespace:xxx.Converters" 
      x:Class="xxx.Application.App"> 

    <Application.Resources> 
     <ResourceDictionary> 
      <converters:VisibilityConverter x:Key="VisibilityConverter" /> 
+0

Проблема, с которой я сталкиваюсь с использованием «TextBlocks» для отображения Body, заключается в том, что Body будет иметь 'Гиперссылка'. Как я могу использовать конвертер видимости? (Я никогда не смотрел на silverlight до 2 дней назад, так что это все новое для меня) –

+0

Просто проверил, как будет выглядеть макет, если бы я просто сделал 3 отдельных «RickTextBoxs», и это выглядит отлично, поэтому, если есть способ скрыть «RichTextBox» на лету на основе привязки, похоже, что это сработает. –

+0

См. Мой обновленный ответ. Что вы можете сделать, создайте два 'RichTextBoxes', один для отображения Body, один для отображения Upload. В выгрузке «RichTextBox» вы используете конвертер видимости, чтобы проверить, пустует ли Upload, если это так, установите видимость в null. Я скоро выложу образец конвертера видимости. –

Смежные вопросы