如何在MultiBinding中使用StringFormat?

时间:2016-08-11 01:13:03

标签: c# wpf

我有以下代码:

<TextBlock>
  <TextBlock.Text>
    <MultiBinding StringFormat="{}{0}{1}">
      <Binding Path=".[ServerName]" TargetNullValue=""/>
      <Binding Path=".[InstanceName]" TargetNullValue="" StringFormat="{}\\{0}"/>
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>

但我得到的结果是&#34; ServerNameInstanceName&#34;而不是&#34; ServerName \ InstanceName&#34;

1 个答案:

答案 0 :(得分:2)

如果绑定的目标未键入String,则忽略

StringFormat。因此,MultiBinding上的TextBlock.Text将被使用,因为StringLabel.Content(如果您绑定到Label.Content则无效,因为{ {1}}是Object - 一个常见的抱怨)。内部绑定到.[InstanceName],没有标记为String的目标,因为MultiBindings必须接受任何类型的值。这样就忽略了StringFormat

以下作品。

<TextBlock>
  <TextBlock.Text>
    <MultiBinding StringFormat="{}{0}\{1}">
      <Binding Path=".[ServerName]" TargetNullValue=""/>
      <Binding Path=".[InstanceName]" TargetNullValue="" />
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>

如果您按照自己的方式执行操作以消除.[InstanceName]为空的情况下的反斜杠,则表示您遇到了问题。我会编写一个多值转换器来插入反斜杠,或者不跳过StringFormat。没有办法让StringFormat做你需要它做的事情。它不够聪明。

C#

public class ServerInstance : MarkupExtension, IMultiValueConverter
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }

    public object Convert(object[] values, Type targetType, 
        object parameter, CultureInfo culture)
    {
        var server = $"{values[0]}0";
        var instance = $"{values[1]}";

        if (instance == "")
            return server;

        if (server == "")
            return "";

        return $"{server}\\{instance}";
    }

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

XAML

<TextBlock>
  <TextBlock.Text>
    <MultiBinding Converter="{local:ServerInstance}">
      <Binding Path=".[ServerName]" />
      <Binding Path=".[InstanceName]" />
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>