Вложенные 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>