2009-07-12 19 views
12

Ho un IValueConverter il cui compito è quello di convertire un BlockId in un ConditionLabel. Il problema è che il mio oggetto Model è ciò che ha l'intelligenza di fare la conversione effettiva. Il mio codice simile a questo finora ...Come si passano i dati in un IValueConverter in XAML?

public class BlockIdToConditionLabelConverter : IValueConverter 
{ 
    private Model _model; 

    public BlockIdToConditionLabelConverter(Model model) 
    { 
     _model = model; 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     int blockId = (int)value; 
     return _model.BlockIdToConditionLabel(blockId); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Binding.DoNothing; 
    } 
} 

Al momento, ho creare una risorsa statica in un ResourceDictionary come questo (e in seguito fare riferimento ad esso in un DataTemplate):

<local:BlockIdToConditionLabelConverter 
    x:Key="_blockIdToConditionLabelConverter" /> 

Il il problema è che ho bisogno di un modo per passare il mio oggetto Modello in questo convertitore. Come potrei farlo?

Grazie.

risposta

7

Questo è un problema classico con convertitori di valore.

Se si utilizza il pattern MVVM, è possibile risolvere il problema implementando la conversione all'interno del ViewModel del modello.

In caso contrario, è possibile dare un'occhiata a this post on MSDN forums. (risposta da Sam Bent - MSFT)

L'obiettivo è utilizzare la multibinding per passare il modello al convertitore, in questo caso passare il DataContext.

+0

Bene, ora mi stai leggendo su MVVM :) Potrebbe essere molto sensato per me iniziare a usarlo, perché stavo incontrando esattamente il problema che il modello sembra voler risolvere: dove metto il mio convertitore logica? Non ho ancora letto abbastanza per capire cosa intendi per "implementare la conversione all'interno del ViewModel del tuo modello". Questo significa che non uso affatto IValueConverters? O solo che il ViewModel (piuttosto che il markup XAML) ha il compito di istanziarli? Grazie! – devuxer

+1

Non sono sicuro di come viene implementata la classe Model. In MVVM, invece di avere il modello come DataContext in WPF, si dovrebbe avere ViewModel come DataContext. Immagino che inizialmente si vincolasse la proprietà BlockId del modello. Il tuo ViewModel avrebbe una proprietà ConditionLabel, che dovresti collegare invece di BlockId. Questa proprietà farebbe la conversione all'interno del getter. Il tuo ViewModel sarà registrato su PropertyChanged del tuo modello, quindi puoi RaisePropertyChange ("ConditionLabel") nel ViewModel. – decasteljau

+0

Ho letto un po 'di più su MVVM, quindi sta iniziando a dare un senso. Potrei semplicemente memorizzare i dati convertiti nel mio ViewModel e rimuovere completamente IValueConverters. Un problema, tuttavia, è che stavo progettando di utilizzare questo IValueConverter con un GridView, quindi avrei bisogno di memorizzare un'intera tabella di dati convertiti nel mio ViewModel (non solo una singola proprietà). Un Convertitore IValue avrebbe ancora senso per questo? E se volessi trasformare tutte le celle GridView in cui il blocco è completo in grigio chiaro? Anche se memorizzassi una tabella "IsComplete" nel ViewModel, dovrei comunque convertirla in un colore. – devuxer

Problemi correlati