2012-04-23 14 views
13

Grałem około z WPF na dłuższą chwilę teraz, ale po raz pierwszy dzisiaj, potrzebowałem zagnieździć się MultiBinding wewnątrz innego, coś jak:Zagnieżdżony MultiBinding (s)

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

otrzymuję wyjątek wskazuje to nie jest dozwolony przez ramy:

XamlParseException był nieobsługiwany: Dodawanie wartości do kolekcji typu „System.Collections.ObjectModel.Collection (System.Windows.Data.BindingBase)” zwrócił wyjątek.

InnerException jest bardziej wyraźne:

BindingCollection nie obsługuje elementów typu MultiBinding. Dozwolone jest tylko powiązanie.

Więc kopanie w Internecie po więcej informacji, natknąłem się na this Microsoft Connect issue co jest dokładnie moim problemem.

Dziękujemy za opinię. WPF nie obsługuje tego dzisiaj. Ta funkcja jest wymagana od lat (ostatnio na początku tego miesiąca - patrz https://connect.microsoft.com/WPF/feedback/details/650164/nested-multibinding). Będziemy to rozważać w przyszłych wydaniach.

Teraz zrobiłem mój spokój, że nie będzie mi łatwo. Nadal potrzebuję tego, jak zagnieżdżać MultiBindings?

+0

Co to jest, że starasz się zrobić, że chcesz multibindings gniazdo? –

+0

Konwertuję wartości logiczne ze złożonymi kolejnością pierwszeństwa i chociaż niektóre z nich są już wartościami logicznymi, inne wymagają najpierw konwersji, a zatem same są osadzone w innym 'IMultiValueConverter' (s). –

+0

Jeśli inne MultiValueConverters mają nie więcej niż dwie wartości wejściowe, możesz użyć konwertera z parametrem zamiast ... lub możesz użyć konwertera ze złożonym parametrem do wprowadzania wielu wartości, co jest trochę pracy, ale powinno zrobić sztuczka. Jeśli to brzmi wykonalne, mógłbym wysłać próbkę? –

Odpowiedz

0

wystarczy użyć jednego multibinding a MultiConverter.

lub co wolę wystawić swój stan w jednej właściwości swojego viewmodel/datacontext.

+8

Tak, ale to pokonuje cały cel, jeśli potrzebuję stworzyć nowy konwerter, który po prostu łączy innych konwerterów, a ponieważ mam ich około setkę ... To jest wiele elementów . –

+0

tak, ale to by działało;) – blindmeis

+0

Rzeczywiście tak, ale próbuję ponownie użyć tego, co już mam;) –

1

Jeśli wiązanie do łańcucha można wykorzystać StringFormat tak jak w poniższym przykładzie:

<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

Jestem wiążący dla booleans (patrz komentarze na pytanie), a także dla POCO. –

4

Jeśli masz konwerter, który przyjmuje parametr, można zrobić coś takiego:

  • Utwórz klasę za przepuszczanie „Fixed” dane do konwertera
  • Dodaj DependencyProperties do klasy (dzięki czemu można powiązać wartości w XAML)
  • W swojej XAML, używać wiązania z konwerterem zamiast MultiBinding, coś takiego:

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

Ograniczeniem jest to, że (AFAIK) wartość zostanie przeliczona tylko jeśli CoreValue zmian - wygrał 't automatycznie się ponownie wiąże, jeśli parametry konwertera ulegną zmianie.

(Przepraszam za ewentualne błędy, piszę to bez korzystania z VS do przetestowania w ...)

+0

Myślę, że jest to poprawny pomysł, ale optymalizacja z dziedziczeniem DataContext zajęłaby zbyt dużo czasu, aby można było powiązać właściwości ParameterClass. –

4

Zdaję sobie sprawę, że jest to stare pytanie teraz, ale ja po prostu trafić dokładnie taki sam problem jak OP.Na szczęście w moim przypadku mogłem połączyć się z podelementem, w którym obliczano już efekt wiązania wielokrotnego, ale przyszło mi do głowy ...

Rozwiązanie (choć wprawdzie niezbyt czyste) byłoby pisaniem wartość powiązania wielowartościowego do właściwości "zapasowej", takiej jak element "Tag", który można następnie odwołać w innych powiązaniach wielowartościowych, określając atrybut "ElementName".

Jeśli potrzebujesz więcej niż jednego zagnieżdżonego wielowartościowego wiązania, możesz utworzyć "fałszywy" obiekt z pewnymi właściwościami zależności, aby przechowywać wiele pośrednich wyników.

Szkoda, że ​​Microsoft nie wdrożyć system prawidłowo zagnieżdżony ...