带绑定StringFormat的MultiBinding

时间:2014-08-11 16:27:51

标签: wpf binding multibinding

我正在尝试使用MultiBinding和StringFormat上的Binding显示一些标签。

就像那样:

<Label.Content>
    <TextBlock>
        <TextBlock.Text>
            <MultiBinding StringFormat="{Binding LabelStringFormat, Source={DynamicResource Texts}}">
                <Binding Path="Lib1" />
                <Binding Path="Lib2" />
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>
</Label.Content>

LabelStringFormat可以是&#34; [{0} / {1}]&#34;或类似的东西。它在构建中是已知的,但必须在Resource中使用。

但是当我使用上面代码之类的东西时,我会收到错误:

A 'Binding' cannot be set on the 'StringFormat' property of type 'MultiBinding'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.

我可以在Content上使用绑定并在ViewModel中创建字符串,但是当有更多像这样的标签时,它就不会被注意到。

由于 的Jakub

SOLUTION:

使用转换器:

public class StringMultiValueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return string.Format(values.Last() as string, values);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

在WPF中将convertor添加到Resources:

<UserControl.Resources>
    <ResourceDictionary>
        <myComponents:StringMultiValueConverter x:Key="stringMultiValueConverter"/>
    </ResourceDictionary>
</UserControl.Resources>

在标签中添加:

<Label.Content>
    <TextBlock>
        <TextBlock.Text>
            <MultiBinding Converter="{StaticResource stringMultiValueConverter}">
                <Binding Path="Lib1" />
                <Binding Path="Lib2" />
                <Binding Path="LabelStringFormat" Source="{Dynamic Texts}"/>
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>
</Label.Content>

当字符串格式是Multibinding的最后一个参数时,这项工作。

2 个答案:

答案 0 :(得分:1)

我认为你不需要在MultiBinding.StringFormat属性上使用Binding。相反,你能做这样的事吗?

<Label.Content>
    <TextBlock>
        <TextBlock.Text>
            <MultiBinding StringFormat="{DynamicResource Texts.LabelStringFormat}">
                <Binding Path="Lib1" />
                <Binding Path="Lib2" />
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>
</Label.Content>

答案 1 :(得分:0)

只需添加&#34; LabelStringFormat&#34;作为多重绑定的参数:

<MultiBinding>
    <Binding Path="Lib1" />
    <Binding Path="Lib2" />
    <Binding Path="LabelStringFormat" Source="{DynamicResource Texts}" />
</MultiBinding>

使用String.Format((string)values[2], values[0], values[1])从IValueConverter进行格式化。