Вложенные MultiBinding (s)

Я уже довольно давно играю с WPF, но впервые сегодня мне нужно было вложить MultiBinding внутри другого, что-то вроде:

<MultiBinding>
   <Binding />       
   <MultiBinding>
      <Binding />
      <Binding />
   </MultiBinding>
</MultiBinding>

Я получаю исключение, указывающее, что это не разрешено в рамках:

XamlParseException было необработанным: добавить значение в коллекцию типа ' System.Коллекции.Объектную модель.система сбора.Окна.Данные.BindingBase)' выбросил исключение.

на InnerException более явное:

BindingCollection не поддерживает элементы типа MultiBinding. Допускается только привязка.

Итак, копая в интернете для получения дополнительной информации, я наткнулся на эта проблема Microsoft Connect это именно моя проблема.

Спасибо за отзыв. WPF не поддерживает это сегодня. Этот функция была запрошена в течение многих лет (последний раз в начале этого месяца - видеть https://connect.microsoft.com/WPF/feedback/details/650164/nested-multibinding). Мы продолжим рассматривать это для будущих релизов.

прямо сейчас я сделал свой мир, что мне будет нелегко. И все же мне это нужно, как я могу вложить MultiBindings?

4 ответов


просто используйте один multibinding MultiConverter.

или то, что я предпочитаю выставлять ваше состояние в одном свойстве вашего viewmodel/datacontext.


Если у вас есть конвертер, который принимает параметр, вы можете сделать что-то вроде этого:

  • создайте класс для передачи "фиксированных" данных в ваш конвертер
  • добавить DependencyProperties к классу (чтобы можно было привязать значения в Xaml)
  • в XAML, использовать привязки с преобразователем вместо multibinding, что-то вроде этого:

    <MultiBinding>
        <Binding Source="SomeObject" Path="CoreValue" Converter="{StaticResource YourNewConverter}">
            <Binding.ConverterParameter>
                <ns:ParameterClass Value1="{Binding Parameter1}" Value2="{Binding Parameter1}" />
            </Binding.ConverterParameter>
        </Binding>
     .... 
    

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

(извиняюсь за любые ошибки, я печатаю это без преимущества VS для тестирования...)


Я понимаю, что это старый вопрос, но я просто ударила точно такая же проблема, как ФП. К счастью, в моем случае я мог бы привязать к суб-элемента, где в результате мульти-привязки уже был просчитан, но это заставило меня задуматься...

a (хотя, по общему признанию, не очень чистым) решением было бы записать значение многозначной привязки в "запасное" свойство, такое как " тег " элемента, на который вы можете ссылаться в других многозначных привязках, указав атрибут' ElementName'.

Если вам нужно больше, чем одна вложенная многозначная привязка, вы можете создать "поддельный" объект с некоторыми свойствами зависимости от него для хранения нескольких промежуточных результатов.

жаль, что Microsoft не реализует должным образом вложенную систему...


Если вы привязываетесь к строке, вы можете использовать StringFormat так же, как в этом примере:

 <TextBlock>
   <TextBlock.Text>
     <MultiBinding StringFormat="{}{0:0.###}/{1:0.###}" Mode="OneWay">
                        <Binding ElementName="This" Path="AggregatedDocDetail.ConfirmedQty"></Binding>
                        <Binding ElementName="This" Path="AggregatedDocDetail.Qty">   </Binding>
       </MultiBinding>
     </TextBlock.Text>
   </TextBlock>