我正在使用MVVM处理WPF / XAML应用程序,并在我的viewmodel上将字符串集合作为属性。我想连接字符串以在文本块或类似控件中显示。应使用文本“AND”连接字符串,并且应使用粗体字体权重设置连接文本的样式。输出看起来像这样:
猫 AND 狗 AND 鼠标 AND 兔子
实现最终结果的最佳方式是什么?
答案 0 :(得分:2)
由于您无法绑定到只读TextBlock.Inlines属性,我建议创建一个带有TextList
属性的派生TextBlock:
public class TextListBlock : TextBlock
{
public static readonly DependencyProperty TextListProperty = DependencyProperty.Register(
"TextList", typeof(IEnumerable<string>), typeof(TextListBlock),
new PropertyMetadata((o, e) => ((TextListBlock)o).TextListChanged((IEnumerable<string>)e.NewValue)));
public IEnumerable<string> TextList
{
get { return (IEnumerable<string>)GetValue(TextListProperty); }
set { SetValue(TextListProperty, value); }
}
private void TextListChanged(IEnumerable<string> textList)
{
bool addSeparator = false;
foreach (string text in textList)
{
if (addSeparator)
{
Inlines.Add(new Run(" AND ") { FontWeight = FontWeights.Bold });
}
Inlines.Add(new Run(text));
addSeparator = true;
}
}
}
答案 1 :(得分:0)
我最终为集合中的每个项目创建了一个ViewModel(在我的示例中是动物)。在这样做的过程中,我添加了一个名为IsNotLast的属性,它可以帮助我确定何时应该在项目之间显示“AND”文本。另外,我使用了BooleanToVisibilityConverter,以便适当地设置我的XAML中的visibility属性。
下面是使用ItemsControl和DataTemplate的示例XAML。
<ItemsControl ItemsSource="{Binding Path=Animals}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock
Text="{Binding AnimalName}"
/>
<TextBlock
Text=" AND "
FontWeight="Bold"
Visibility="{Binding IsNotLast, Converter={StaticResource booleanToVisibilityConverter}}"
/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>