2010-02-10 6 views
11

Ho scritto un MultiValueConverter che controlla se un dato elenco contiene un determinato valore e restituisce true se lo fa. Lo uso per il collegamento alla lista di controllo personalizzata. Ora mi piacerebbe scrivere il metodo ConvertBack in modo che se la casella fosse selezionata, il valore originale sarebbe stato inviato al modello. C'è un modo per accedere ai valori nel metodo ConvertBack?WPF: C'è un modo per ottenere valori originali nel metodo ConvertBack di 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> 

ottengo risultati corretti quando sono vincolanti, ma c'è un modo per ottenere l'id legato durante la conversione di nuovo? Quello che vorrei ottenere è che se la casella di controllo è deselezionata, il valore verrà rimosso dall'elenco e se è selezionato, il valore verrà aggiunto all'elenco.

+0

Ho un problema simile in cui uno dei miei collegamenti nella multibinding è un oggetto con un elenco di oggetti che contengono un campo di testo. la multibinding è associata a una delle caselle di testo in base all'altro valore di bind. Ho bisogno della casella di testo per cambiare il testo dell'oggetto su convertBack, ma tutto quello che ho è il nuovo valore, e non il testo dell'oggetto che deve cambiare – JoeSharp

risposta

5

Ho risolto il problema e spero che la soluzione possa essere d'aiuto anche a voi. Prendi il multibinding che hai e invece di inserirlo nell'attributo IsChecked, mettilo nell'attributo DataContext. Questo può essere dove i nostri problemi differiscono ... nel mio metodo di conversione, stavo usando i dati nei binding per afferrare un oggetto, e poi ho restituito myobject.text. Ho cambiato questo per restituire invece solo l'oggetto, in modo che venga associato al datacontext. Ho quindi legato la proprietà textbox.text alla proprietà text di myobject. Sembra che funzioni bene. È quindi possibile associare l'elenco in cui i valori vengono rimossi alla casella di controllo.ischecked ... Suppongo. Non sono esattamente sicuro di cosa stai cercando di fare.

Sto pensando che questo potrebbe ottenere sulla strada giusta ...

<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

So che questo è un vecchio problema, ma questa soluzione potrebbe aiutare qualcun altro.

Invece di utilizzare il metodo del IMultiValueConverterConvertBack, è possibile impostare la IsChecked vincolanti per essere OneWay e utilizzare la proprietà CheckBoxCommand per eseguire la logica di controllo.

<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> 

Quindi, aggiungere il CheckBoxCommand che esegue qualcosa di simile a questo:

// 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); 
    } 

So che è un su tutto l'modo un po 'di fare questo, ma il metodo IMultiValueConverter.ConvertBack è davvero del tutto inutile - che posso' Pensiamo a troppi usi per questo senza avere accesso ai valori di associazione attuali.

+3

Grazie per questo approccio, che ha funzionato per me. Mi ci è voluto un po 'di tempo per capire che ConvertBack è completamente inutile. Dovrebbero metterlo nella documentazione e salvarci un po 'di tempo. – Jan

+0

Yup totalmente inutile :( – Asheh

Problemi correlati