2012-04-13 16 views
0

私はちょうどListBoxの中にたくさんのxmlデータを表示するアプリケーションで作業を始めましたが、問題はすべてのxmlアイテムが子の値を持っているわけではありません。そのlistBoxコードは表示されません。Windows Phone 7ダイナミックリストボックステンプレート

例:

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

私はこの方法でデータを取得し、私のリストを移入しています:私はしたいもの

<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> 

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は次のようになりますxmlアップロードの子が値を保持している場合にのみ、アップロード情報を保持する段落を表示します。それ以外の場合は、listBoxから削除してください。私はどのように基本的なリストボックスのテンプレートを変更する方法を把握することはできません。

助けがあれば助かります。

+0

を意味していますか? –

+0

いいえ、アップロードが空の場合、「」(アップロード値を保持する段落)を非表示にしたい –

+0

アップロードが空の場合、何も表示されませんが正しいですか? –

答えて

0

TextBlocksをBodyとCreatedと表示することはどうですか?中間部分はRichTextBoxになります。アップロードが空の場合は、表示/非表示を切り替えるために視認性コンバータを使用できます。

あなたはその後、コンバータはこのような何か、

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(); 
     } 
    } 
でなければなりません

   <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> 

、テンプレート内で使用

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

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

、まずあなたのXAMLページで、あなたのコンバータを含める必要が

バリューコンバータの詳細については、thisを参照してください。あなたのApp.xamlで

UPDATE

、これを行うには、アップロードが空の場合、あなたは全体の `StackPanel`を非表示にする

<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

Bodyを表示するために 'TextBlocks'を使用して実行する問題はBodyにハイパーリンク。しかし、Visibilityコンバーターはどのように使用しますか? (私は2日前までシルバーライトを見ていなかったので、これは全く新しいものです) –

+0

3つの別々の 'RickTextBoxs'を作成しただけで、レイアウトがどのように見えるかをテストしました。 Bindingに基づいてその場で 'RichTextBox'を隠す方法は、うまくいくようです。 –

+0

私の更新された答えを見てください。あなたができることは、Bodyを表示するためのものと、Uploadを表示するためのものの2つの 'RichTextBoxes 'を作成することです。アップロード 'RichTextBox'では、可視性コンバータを使用してアップロードが空であるかどうかを確認し、空であればnullに設定します。私はすぐに可視性コンバータのサンプルをアップロードします。 –

関連する問題