您可以在下面看到View和ViewModel。 结果将是:“A B C”,每个字母的背景为红色。 我想在项目之间添加一个箭头但是我不希望箭头用红色着色。 这意味着它应该是这样的:“A - > B - > C”,只有字母将用红色着色,箭头不。 我可以使用转换器在Text属性上添加箭头,但它也会最终为箭头着色。
任何想法?
的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>
代码背后:
public class MainWindowViewModel
{
public MainWindowViewModel()
{
MyArray = new ObservableCollection<string>();
MyArray.Add("A");
MyArray.Add("B");
MyArray.Add("C");
}
public ObservableCollection<string> MyArray { get; set; }
}
答案 0 :(得分:1)
您可以轻松地执行此操作:
<TextBlock Margin="5">
<Run Background="Red" Text="{Binding}"/>
<Run Text="->"/>
</TextBlock>
或者,如果您真的必须将其保留在数据模板之外,请使用ItemContainerStyle
并为Template
分配一个新的ListBoxItem
,其中包含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>
答案 1 :(得分:0)
如果您知道收藏中的最大商品数量,则可以将AlternationCount
的{{1}}设置为高于收藏中商品数量的数字,然后使用{ {1}}确定分隔符项的可见性或文本。
ListBox
修改强>
正如HB在他的回答中指出的那样,您也可以将DataTrigger
作为RelativeSource.PreviousData的基础,但只有<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>
中的所有项目都不是DataTrigger
时才会有效}