Ответ 1
просто используйте один мультипереключатель MultiConverter.
или то, что я предпочитаю, выставлять свое условие в одном свойстве вашего viewmodel/datacontext.
Я уже давно играю с 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?
просто используйте один мультипереключатель MultiConverter.
или то, что я предпочитаю, выставлять свое условие в одном свойстве вашего viewmodel/datacontext.
Если у вас есть конвертер, который принимает параметр, вы можете сделать что-то вроде этого:
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 для тестирования...)
Я понимаю, что сейчас это старый вопрос, но я просто столкнулся с той же проблемой, что и OP. К счастью, в моем случае я мог привязываться к подэлементу, где результат многосвязной уже вычислялся, но он заставил меня думать...
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>
Альтернативой другим предложениям является использование вложенных свойств для хранения вложенного 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>
Я знаю, что этому вопросу уже более шести лет, но я столкнулся с ним, так что кто-то другой тоже будет.