2012-01-18 3 views
0

以下に、ViewとViewModelが表示されます。 結果は次のようになります。背景の各文字がである「A B C」が赤です。 アイテム間に矢印を追加したいBUT矢印を赤で塗りつぶしてはいけません。 それは、このようなものでなければならないことを意味します: "A - > B - > C"だけ、文字は赤で色付けされ、矢印はではなくです。 Converterを使ってTextプロパティの矢印を追加することもできますが、矢印の色も変わります。ItemTemplateの影響を受けないリストボックスアイテムに区切り文字を追加する方法

XAML:背後に

<ListBox ItemsSource="{Binding MyArray}"> 
    <ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <WrapPanel/> 
    </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Background="Red" Text="{Binding}" Margin="5"/> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

コード:

<TextBlock Margin="5"> 
     <Run Background="Red" Text="{Binding}"/> 
     <Run Text="->"/> 
    </TextBlock> 

それとも、本当に使うデータテンプレートのうち、それを維持しなければならない場合:

public class MainWindowViewModel 
{ 
    public MainWindowViewModel() 
    { 
     MyArray = new ObservableCollection<string>(); 
     MyArray.Add("A"); 
     MyArray.Add("B"); 
     MyArray.Add("C"); 
    } 
    public ObservableCollection<string> MyArray { get; set; } 
} 

答えて

1

あなたは簡単にこれを行うことができますItemContainerStyleを入力し、arを含むListBoxItemに新しいTemplateを割り当てますアイテムテンプレートが表示されるContentPresenterの横に表示されます(矢印が選択されていないようにするとよいでしょう)。

編集:私は結合PreviousDataで追加の矢印で問題に近づくだろう、それがnullの場合、何の項目がその前に存在しません:

<DataTemplate> 
    <!-- StackPanel because Runs can't be collapsed, you could clear their text though --> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="->"> 
      <TextBlock.Style> 
       <Style TargetType="TextBlock"> 
        <Style.Triggers> 
         <DataTrigger 
           Binding="{Binding RelativeSource={RelativeSource PreviousData}}" 
           Value="{x:Null}"> 
          <Setter Property="Visibility" Value="Collapsed" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </TextBlock.Style> 
     </TextBlock> 
     <TextBlock Text="{Binding}" Background="Red" /> 
    </StackPanel> 
</DataTemplate> 
+0

予定されていない場合にのみ動作すること、RelativeSource.PreviousDataであなたのDataTriggerを、ベースことができますそのルートは 'A - > B - > C - >'で終わりますが、これは作者の質問ではありません。最初に質問を読んでから答えてください。 –

+0

こんにちは、あなたの答えをありがとう。しかし、今私は "双方向バインディングは、パスまたはXPathを必要とする"エラーが出ている、私はテキスト= "{結合パス= DataContext、RelativeSource = {RelativeSource自己}}"を使用してこれを解決しました、エラーについてのアイデア? – EitanG

+0

@EitanG全体のエラーメッセージを投稿できますか? –

0

、あなたの中のアイテムの最大数を知っていればコレクション内のアイテムの数よりも多い数字にListBoxAlternationCountを設定してから、DataTriggerを使用して、セパレータアイテムの表示またはテキストを判断することができます。

<Style x:Key="ArrowTextBlockStyle" TargetType="{x:Type TextBlock}"> 
    <Setter Property="Text" Value="->" /> 
    <Style.Triggers> 
     <DataTrigger Value="0" Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=(ItemsControl.AlternationIndex)}"> 
      <Setter Property="Text" Value="" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

<ListBox AlternationCount="100" ItemsSource="{Binding MyArray}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal" Margin="5"> 
       <TextBlock Style="{StaticResource ArrowTextBlockStyle}" /> 
       <TextBlock Text="{Binding }" Background="Red" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

編集

HBが彼の答えで指摘したように、あなたはしかし、あなたのItemsSource内の項目のどれもnull

+0

'StackPanel' ...なぜですか? –

+0

@HBわかりやすいですから。あなたが持っている方法で 'TextBlock' /' Run'で置き換えることができると思いますが、私は通常Runを使いません。 – Rachel

+0

あなたは素晴らしいことができます。 –

関連する問題