2010-02-10 15 views
11

Napisałem MultiValueConverter, który sprawdza, czy dana lista zawiera daną wartość i zwraca true, jeśli tak. Używam go do wiązania niestandardowej listy wyboru. Teraz chciałbym napisać metodę ConvertBack, aby po zaznaczeniu pola wyboru oryginalna wartość została wysłana do modelu. Czy istnieje sposób dostępu do wartości w metodzie ConvertBack?WPF: Czy istnieje sposób na uzyskanie oryginalnych wartości w metodzie ConvertBack MultiValueConverter?

XAML:

<ListBox.ItemTemplate> 
    <HierarchicalDataTemplate> 
     <CheckBox Content="{Binding Path=Description}"> 
      <CheckBox.IsChecked> 
       <MultiBinding Converter="{x:Static Classes:ListContainsMultiConverter.Instance}"> 
        <Binding Path="Id" /> 
        <Binding Path="DataContext.ContactTypes" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" /> 
       </MultiBinding> 
      </CheckBox.IsChecked> 
     </CheckBox> 
    </HierarchicalDataTemplate> 
</ListBox.ItemTemplate> 

uzyskać poprawne wyniki, kiedy jestem wiążące, ale czy istnieje sposób, aby uzyskać związanego id podczas konwersji z powrotem? Chciałem osiągnąć to, że jeśli pole wyboru nie zostanie zaznaczone, wartość zostanie usunięta z listy i jeśli zostanie zaznaczona, wartość zostanie dodana do listy.

+0

Mam podobny problem, w którym jedno z moich powiązań w multibinding jest obiektem z listą obiektów zawierających pole tekstowe. Multibinding jest powiązany z jednym z pól tekstowych na podstawie innej wartości wiązania. Potrzebuję pola tekstowego, aby zmienić tekst obiektu na convertBack, ale wszystko, co mam, to nowa wartość, a nie to, jaki tekst obiektu musi zmienić – JoeSharp

Odpowiedz

5

Rozwiązałem mój problem, i mam nadzieję, że rozwiązanie również ci pomoże. Weź multibinding, który masz, i zamiast umieszczać go w atrybucie IsChecked, umieść go w atrybucie DataContext. Może to być, gdzie nasze problemy różnią się ... w mojej metodzie konwersji, użyłem danych w powiązaniach, aby pobrać obiekt, a następnie zwróciłem myobject.text. Zmieniłem to, aby zamiast tego zwracało tylko ten obiekt, aby został powiązany z datacontextem. Następnie powiązałem właściwość textbox.text z właściwością text myobject. wydaje się działać dobrze. Możesz następnie powiązać listę, w której wartości są usuwane z polem wyboru. Sprawdzane ... Chyba. Nie jestem do końca pewien, co próbujesz zrobić.

myślę, że to może Ci na dobrej drodze ...

<ListBox.ItemTemplate> 
<HierarchicalDataTemplate> 
    <CheckBox Content="{Binding Path=Description}"> 
     <CheckBox.DataContext> 
      <MultiBinding Converter="{x:Static Classes:ListContainsMultiConverter.Instance}"> 
       <Binding Path="Id" /> 
       <Binding Path="DataContext.ContactTypes" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" /> 
      </MultiBinding> 
     </CheckBox.DataContext> 
     <CheckBox.IsChecked> 
      <Binding Path="Some_Property_For_IsChecked_In_Some_Object_In_The_Converter" /> 
     </CheckBox.IsChecked> 
    </CheckBox> 
</HierarchicalDataTemplate> 

6

Wiem, że to stary problem, ale to rozwiązanie może pomóc komuś innemu.

Zamiast sposobu według IMultiValueConverterConvertBack, można ustawić IsChecked wiążące się OneWay i użyć właściwości CheckBoxCommand wykonać logikę wyboru.

<ListBox.ItemTemplate> 
    <HierarchicalDataTemplate> 
     <CheckBox Content="{Binding Path=.}" Command="{Binding Path=CheckBoxCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" CommandParameter="{Binding Path=.}"> 
      <CheckBox.IsChecked> 
       <MultiBinding Converter="{x:Static Classes:ListContainsMultiConverter.Instance}" Mode="OneWay"> 
        <Binding Path="." /> 
        <Binding Path="SelectedItems" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" /> 
       </MultiBinding> 
      </CheckBox.IsChecked> 
     </CheckBox> 
    </HierarchicalDataTemplate> 
</ListBox.ItemTemplate> 

Następnie dodaj CheckBoxCommand która wykonuje coś podobnego do tego:

// the items bound to your checkbox 
    public Collection<string> Items { get; set; } 

    // the list of selected items 
    public Collection<string> SelectedItems { get; set; } 

    private void ExecuteCheckBoxCommand(string obj) 
    { 
     SelectedItems.Add(obj); 
    } 

Wiem, że to nieco okrągłym o sposób to zrobić, ale metoda IMultiValueConverter.ConvertBack jest naprawdę całkiem bezużyteczny - mogę” t myśli o zbyt wielu zastosowaniach bez dostępu do bieżących wartości wiążących.

+3

Dziękuję za to podejście, które zadziałało dla mnie. Zajęło mi trochę czasu uświadomienie sobie, że ConvertBack jest całkowicie bezużyteczny. Powinni umieścić to w dokumentacji i zaoszczędzić nam trochę czasu. – Jan

+0

Yup całkowicie bezużyteczny :( – Asheh

Powiązane problemy