2009-07-12 2 views
12

У меня есть IValueConverter, задачей которого является преобразование BlockId в ConditionLabel. Проблема в том, что мой объект Model - это то, что умеет делать фактическое преобразование. Мой код выглядит следующим образом до сих пор ...Как вы передаете данные в IValueConverter в 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; 
    } 
} 

На данный момент я создаю статический ресурс в ResourceDictionary, как это (и позже ссылаться на него в DataTemplate):

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

проблема в том, что мне нужен способ передать объект Model в этот конвертер. Как мне это сделать?

Спасибо.

ответ

7

Это классическая проблема со значениями преобразователей.

Если вы используете шаблон MVVM, вы можете решить эту проблему, выполнив преобразование в ViewModel вашей модели.

Если нет, вы можете взглянуть на this post on MSDN forums. (ответ от Сэма Бента - MSFT)

Цель состоит в том, чтобы использовать multibinding, чтобы передать модель конвертеру, в этом случае передайте DataContext.

+0

Ну, теперь вы меня читаете на MVVM :) Мне может быть очень полезно, если я начну использовать его, потому что я столкнулся с проблемой, которую, похоже, хочет решить шаблон: Где я могу поместить мой конвертер логика? Я еще недостаточно читал, чтобы понять, что вы подразумеваете под «реализацией преобразования внутри ViewModel вашей модели». Означает ли это, что я вообще не использую IValueConverters? Или просто, что ViewModel (а не разметка XAML) имеет задачу их создания? Благодаря! – devuxer

+1

Я не уверен, как ваш класс модели реализован. В MVVM вместо модели в качестве вашего DataContext в WPF у вас будет ViewModel как ваш DataContext. Я предполагаю, что вы изначально связывали свойство BlockId вашей модели. Ваша ViewModel будет иметь свойство ConditionLabel, которое вы бы привязали вместо BlockId. Это свойство выполнит преобразование внутри получателя. Ваша модель ViewModel будет зарегистрирована в PropertyChanged вашей модели, поэтому вы можете RaisePropertyChange («ConditionLabel») в вашей модели ViewModel. – decasteljau

+0

Я читал еще несколько о MVVM, так что это начинает иметь смысл. Я мог бы просто сохранить преобразованные данные в моей модели ViewModel и полностью отказаться от IValueConverters. Один из уловков заключается в том, что я планировал использовать этот IValueConverter с GridView, поэтому мне нужно будет хранить целую таблицу преобразованных данных в моей ViewModel (а не только в одном свойстве). Будет ли IValueConverter по-прежнему иметь смысл для этого? И что, если я хочу превратить все ячейки GridView, где Блок полностью светло-серый? Даже если я сохранил таблицу IsComplete в ViewModel, мне все равно нужно было бы преобразовать ее в цвет. – devuxer

Смежные вопросы