2012-04-23 4 views
13

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

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

Я получаю исключение с указанием его не допускается в рамках:

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

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

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

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

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

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

+0

Что это такое, что вы пытаетесь сделать, что вы хотите гнездовые multibindings? –

+0

Я преобразовываю логические значения с сложными порядками приоритета, а некоторые из них уже являются логическими, другие сначала нуждаются в преобразовании и, следовательно, сами встроены в другие 'IMultiValueConverter'. –

+0

Если ваши другие MultiValueConverters имеют не более двух входных значений, вы можете использовать преобразователь с параметром вместо ... или вы можете использовать преобразователь со сложным параметром для ввода нескольких значений, что немного работает, но должно Хитрость. Если это возможно, я могу опубликовать образец? –

ответ

0

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

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

+8

Да, но это побеждает всю его цель, если мне нужно создать новый конвертер, который просто объединяет другие конвертеры, и так как я собрал около сотни ... Это очень много шаблонов , –

+0

да, но это сработало;) – blindmeis

+0

Действительно, это было бы, но я пытаюсь повторно использовать то, что у меня уже есть;) –

1

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

Я привязываюсь к булевым (см. Комментарии к вопросу), а также к POCOs. –

4

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

  • Создать класс для прохождения «фиксированные» данные на преобразователь
  • Добавить 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 изменения - он выиграл 't автоматически восстанавливается, если параметры преобразователя изменяются.

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

+0

Я думаю, что это правильная идея, но для оптимизации DataContext потребуется слишком много времени, чтобы свойства ParameterClass могли быть привязаны. –

4

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

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

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

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