我有以下代码:
<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;
答案 0 :(得分:2)
String
,则忽略 StringFormat
。因此,MultiBinding
上的TextBlock.Text
将被使用,因为String
是Label.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>