2016-08-11 3 views
0

У меня есть следующий код:Как использовать StringFormat в 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»

ответ

2

StringFormat игнорируется, если цель связывания не классифицирован как String. Поэтому будет использоваться StringFormat на MultiBinding, поскольку 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] имеет нулевое значение, у вас есть проблемы. Я бы написал многозначный конвертер, чтобы вставить обратную косую черту, или нет, и пропустите 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> 
+0

Спасибо. Точная причина, по которой я это делал, - исключить обратную косую черту. Я просто хотел избежать конвертеров. –

+0

@ EhsanKeshavarzian Я согласен, всегда лучше держать его в чистом XAML, но я не думаю, что это вариант на этом. –

Смежные вопросы