如何在XAML中连接和设置字符串列表?

时间:2012-08-10 19:21:08

标签: wpf xaml

我正在使用MVVM处理WPF / XAML应用程序,并在我的viewmodel上将字符串集合作为属性。我想连接字符串以在文本块或类似控件中显示。应使用文本“AND”连接字符串,并且应使用粗体字体权重设置连接文本的样式。输出看起来像这样:

AND AND 鼠标 AND 兔子

实现最终结果的最佳方式是什么?

2 个答案:

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