Конвертеры дочерних привязок в MultiBinding - PullRequest
2 голосов
/ 29 апреля 2010

Предположим, у меня есть MultiBinding:

<MultiBinding Converter="{StaticResource FooBarConverter}>
  <Binding Path="Foo" Converter="{StaticResource FooConverter}" />
  <Binding Path="Bar" Converter="{StaticResource BarConverter}" />
</MultiBinding>

Это не похоже на работу: массив значений, переданный в FooBarConverter , содержит DependencyProperty.UnsetValue для каждого значения (в данном случае два). Удаление преобразователей на дочерних привязках ( FooConverter и BarConverter ) дает мне фактические значения. Кстати: эти конвертеры вызываются правильно, похоже, что их результат отбрасывается.

Это предполагаемое поведение? Я хочу связать 2 свойства, мне нужно преобразовать хотя бы одно из них, прежде чем выбросить их в MultiValueConverter ...

Ответы [ 3 ]

4 голосов
/ 20 апреля 2017

Разработчики в общей ссылке Кишора пришли к выводу, что для создания такой MultiBinding дочерние привязки должны возвращать тот же тип результата, что и родительская MultiBinding. Таким образом, в моем случае, если я хотел, чтобы родительский MultiBinding возвращал значение типа Visibility, дочерние Bindings также должны возвращать значения Visibility. В противном случае UnsetValues ​​будет передан вашему методу конвертера, что, вероятно, приведет к нежелательным результатам.

Вот фрагмент кода, который работает для меня. Обратите внимание, что конвертеры «VisibleIfTrue» и «EnumToVisibility» оба возвращают значения видимости типа:

<Grid.Visibility>
    <MultiBinding Converter="{StaticResource MultiVisibilityConverter}">
        <Binding Path="JobHasData" Converter="{StaticResource VisibleIfTrue}" />
        <Binding Path="CurrentMode" Converter="{StaticResource EnumToVisibility}" ConverterParameter="{x:Static Mode.Setup}" />
    </MultiBinding>
</Grid.Visibility>

Раздражает, что вы не можете передать его различным типам значений для обработки и дать вам желаемый результат. (Сначала я пытался передать bools преобразователю.)

Надеюсь, это поможет любому, кто ждал ответа семь лет. ;)

0 голосов
/ 16 ноября 2017

Если WPF был до 4.0, то это известная и исправленная ошибка , которая имеет обходной путь.

Здесь находится пример реализации обходного пути для бедняков, которые вынуждены работать со старшими версиями.

Короче говоря, старые версии wpf пытаются преобразовать значения из дочерних привязок с несколькими привязками, которые имеют преобразователи, напрямую в тип целевого свойства зависимости. Обходной путь - создать скрытую метку, переместить мультисвязывание или его дочерний конвертер привязок в label.content, ожидая объекта, и затем привязать к нему требуемое свойство.

0 голосов
/ 29 апреля 2010

вы упомянули конвертер в теге Multibinding, как это

<TextBlock Grid.Row="3" Grid.Column="1" Padding="5">
    <TextBlock.Text>
      <MultiBinding Converter="{StaticResource sumConverter}">
        <Binding  Path="FirstNum" />
        <Binding  Path="SecondNum" />
        <Binding   Path="ThirdNum" />
      </MultiBinding>
    </TextBlock.Text>
  </TextBlock>
...