Удалить пробел из MultiBinding StringFormat - PullRequest
0 голосов
/ 13 мая 2018

Невозможно удалить пробелы из StringFormat.

Если нет данных типа «Тип», следующий пробел не отступает.

ReleaseDate, пробел, пробел, точка, пробел, пробел, Тип, пробел (по какой-то причине он не удаляет это пробел), Цвет

<TextBlock>
  <TextBlock.Text>
    <MultiBinding StringFormat="{}{0:yyyy}  ·  {1} {2}" >
      <Binding Path="ReleaseDate" FallbackValue="{x:Null}"/>
      <Binding Path="Type" FallbackValue="{x:Null}"/>
      <Binding Path="Color" FallbackValue="{x:Null}"/>
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Хотя подход с DataTrigger работает, он очень многословен. Я хотел бы сделать это в два этапа: связать Type отдельно с StringFormat, который имеет пробел, а затем связать все вместе

<TextBlock Name="Title" 
           local:Attached.SomeString="{Binding Type, 
                                       StringFormat='\{0} ',
                                       TargetNullValue=''}">
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0:yyyy}  ·  {1}{2}">
            <Binding Path="Login" />
            <Binding Path="(local:Attached.SomeString)" 
                     RelativeSource="{RelativeSource Self}" />
            <Binding Path="Name" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

Если тип не равен null, то привязка SomeString использует формат строки и возвращает тип + пробел в конце. Если Тип null, то привязка возвращает пустую строку.

SomeString - это свойство присоединенной зависимости многократного использования без особого значения. Объявлено как

public class Attached
{
    public static readonly DependencyProperty SomeStringProperty =
        DependencyProperty.RegisterAttached("SomeString", typeof (string), typeof (Attached));

    public static void SetSomeString(UIElement element, string value)
    {
        element.SetValue(SomeStringProperty, value);
    }

    public static string GetSomeString(UIElement element)
    {
        return (string)element.GetValue(SomeStringProperty);
    }
}

TextBlock имеет свойство Tag, которое можно использовать для хранения (или связывания) некоторых данных, но Tag имеет тип object и не использует StringFormat из привязки. Поэтому я не мог использовать Tag для своих целей, и мне пришлось создать другое свойство типа string. (обратите внимание также на специальный синтаксис для привязки вложенного свойства)

0 голосов
/ 13 мая 2018

Возможно, вы замените MultiBinding и его StringFormat на DataTrigger:

<TextBlock>
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="Text">
                <Setter.Value>
                    <MultiBinding StringFormat="{}{0:yyyy}  ·  {1} {2}" >
                        <Binding Path="ReleaseDate" FallbackValue="{x:Null}"/>
                        <Binding Path="Type"/>
                        <Binding Path="Color" FallbackValue="{x:Null}"/>
                    </MultiBinding>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Type}" Value="{x:Null}">
                    <Setter Property="Text">
                        <Setter.Value>
                            <MultiBinding StringFormat="{}{0:yyyy}  ·  {1}" >
                                <Binding Path="ReleaseDate" FallbackValue="{x:Null}"/>
                                <Binding Path="Color" FallbackValue="{x:Null}"/>
                            </MultiBinding>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...