将(非多)ValueConverter应用于MultiBinding + StringFormat的输出

时间:2014-06-12 10:49:58

标签: wpf converter multibinding string-formatting

有没有办法将(单个,不是多个)ValueConverter应用于使用StringFormat的MultiBinding的输出(即在格式化字符串之后)。

它将相当于该代码,我使用中间折叠的TextBlock来完成这个技巧:

   <StackPanel>
        <TextBox x:Name="textBox1">TB1</TextBox>
        <TextBox x:Name="textBox2">TB2</TextBox>

        <TextBlock x:Name="textBlock" Visibility="Collapsed">
            <TextBlock.Text>
                <MultiBinding StringFormat="{}{0}{1}">
                    <Binding ElementName="textBox1" Path="Text"/>
                    <Binding ElementName="textBox2" Path="Text"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>

        <TextBlock Text="{Binding ElementName=textBlock,
                   Path=Text, Converter={StaticResource SingleValueConverter}}" />

    </StackPanel>

2 个答案:

答案 0 :(得分:3)

这是一个可以做你想要的黑客:

public static class Proxy
{
    public static readonly DependencyProperty TextProperty = DependencyProperty.RegisterAttached(
        "Text",
        typeof(string),
        typeof(Proxy),
        new PropertyMetadata(string.Empty));

    public static void SetText(this TextBlock element, string value)
    {
        element.SetValue(TextProperty, value);
    }

    [AttachedPropertyBrowsableForChildren(IncludeDescendants = false)]
    [AttachedPropertyBrowsableForType(typeof(TextBlock))]
    public static string GetText(this TextBlock element)
    {
        return (string) element.GetValue(TextProperty);
    }
}
<StackPanel>
    <TextBox x:Name="textBox1">TB1</TextBox>
    <TextBox x:Name="textBox2">TB2</TextBox>

    <TextBlock Text="{Binding Path=(local:Proxy.Text), 
                              RelativeSource={RelativeSource Self}, 
                              Converter={StaticResource SingleValueConverter}}">
        <local:Proxy.Text>
            <MultiBinding StringFormat="{}{0}{1}">
                <Binding ElementName="textBox1" Path="Text" />
                <Binding ElementName="textBox2" Path="Text" />
            </MultiBinding>
        </local:Proxy.Text>
    </TextBlock>
</StackPanel>

答案 1 :(得分:-1)

如果你查看MSDN上的MultiBinding.Converter Property页面,就会发现可以Converter提供MultiBinding。但是,它不是正常IValueConverter,而是需要IMultiValueConverter。它可以像这样使用:

<TextBlock x:Name="textBlock" Visibility="Collapsed">
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0}{1}" Converter="{StaticResource Converter}"
            ConverterParameter="SomeValue">
            <Binding ElementName="textBox1" Path="Text"/>
            <Binding ElementName="textBox2" Path="Text"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

可以在链接页面中找到IMultiValueConverter实现的示例。