Подтвердить что ты не робот

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

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

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

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

XamlParseException был необработанным: добавьте значение в коллекцию типа 'System.Collections.ObjectModel.Collection(System.Windows.Data.BindingBase)', который сделал исключение.

InnerException более явный:

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

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

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

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

4b9b3361

Ответ 1

просто используйте один мультипереключатель MultiConverter.

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

Ответ 2

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

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

    <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 для тестирования...)

Ответ 3

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

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

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

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

Ответ 4

Если вы привязываетесь к строке, вы можете использовать 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>

Ответ 5

Альтернативой другим предложениям является использование вложенных свойств для хранения вложенного MultiBinding качестве промежуточных значений.

Например, вместо:

<Element>
  <Element.Property>
    <MultiBinding>
      <Binding Path="A" />       
      <MultiBinding>
        <Binding Path="B" />
        <Binding Path="C" />
      </MultiBinding>
    </MultiBinding>
  </Element.Property>
</Element>

...сделай это:

<Element Name="ElementName">
  <ElementProperties.AttachedProperty>
    <MultiBinding>
      <Binding Path="B" />
      <Binding Path="C" />
    </MultiBinding>
  </ElementProperties.AttachedProperty>
  <Element.Property>
    <MultiBinding>
      <Binding Path="A" />       
      <Binding ElementName="ElementName" Path="(ElementProperties.AttachedProperty)" />
    </MultiBinding>
  </Element.Property>
</Element>

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