![](/img/trans.png)
[英]Is it possible to use both a converter AND a StringFormat in WPF MultiBinding?
[英]How to use StringFormat in MultiBinding?
我有以下代码:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}{1}">
<Binding Path=".[ServerName]" TargetNullValue=""/>
<Binding Path=".[InstanceName]" TargetNullValue="" StringFormat="{}\\{0}"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
但我得到的结果是“ ServerNameInstanceName”而不是“ ServerName \\ InstanceName”
如果绑定的目标未键入为String
,则将忽略StringFormat
。 因此,将使用MultiBinding
上的StringFormat
,因为TextBlock.Text
是String
(如果您绑定到Label.Content
,因为Label.Content
是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]
为null的情况下的反斜杠,那么您会遇到问题。 我将编写一个多值转换器以插入反斜杠,或者不插入反斜杠,并跳过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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.