2009-09-25 5 views
3

В рамках обучения WPF я только что закончил работу с помощью MS Lab Exercise под названием «Использование привязки данных в WPF» (http://windowsclient.net/downloads/folders/hands-on-labs/entry3729.aspx).Связывание данных Wpf с использованием IMultiValueConverter и ошибки литья

Чтобы проиллюстрировать использование IMultiValueConverter, существует предварительная кодировка реализации, в которой логический результат используется для определения того, является ли привязка данных актуальной для текущего пользователя. Вот код для конвертирования:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { 
     // var rating = int.Parse(values[0].ToString()); 
     var rating = (int)(values[0]); 
     var date = (DateTime)(values[1]); 

     // if the user has a good rating (10+) and has been a member for more than a year, special features are available 
     return _hasGoodRating(rating) && _isLongTimeMember(date); 
    } 

А вот разводка использовать это в XAML:

<ComboBox.IsEnabled> 
    <MultiBinding Converter="{StaticResource specialFeaturesConverter}"> 
    <Binding Path="CurrentUser.Rating" Source="{x:Static Application.Current}"/> 
    <Binding Path="CurrentUser.MemberSince" Source="{x:Static Application.Current}"/> 
    </MultiBinding> 
</ComboBox.IsEnabled> 

код работает отлично, но дизайнер XAML не будет загружаться с " Указанный приведение недействительно. " ошибка. Я попробовал несколько способов не использовать бросок, один из которых я оставил без комментариев в коде выше. Самое смешное - законченное лабораторное упражнение, предоставленное MS, также имеет ошибку.

Кто-нибудь знает, как исправить это, чтобы сделать дизайнера счастливым?

Cheers,
Berryl

ответ

4

Проблема здесь в том, что вы используете Application.Current, который отличается в режиме конструктора и в режиме исполнения.

Когда вы открываете конструктор, Application.Current не будет вашим классом «App» (или тем, что вы назовете его). Таким образом, там нет свойства CurrentUser, и вы получите эту ошибку.

Существует несколько способов исправить это. Самый простой из них, чтобы проверить, если вы находитесь в режиме конструктора:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (Application.Current == null || 
     Application.Current.GetType() != typeof(App)) 
    { 
    // We are in design mode, provide some dummy data 
    return false; 
    } 

    var rating = (int)(values[0]); 
    var date = (DateTime)(values[1]); 

    // if the user has a good rating (10+) and has been a member for more than a year, special features are available 
    return _hasGoodRating(rating) && _isLongTimeMember(date); 
} 

Другой подход был бы не использовать Application.Current в качестве источника для связывания вашего.

Надеюсь, что это поможет :).

+1

Пятно на. Заставляет удивляться, почему хорошие люди в MS не могли это объяснить, как вы это делали, когда публиковали * учебный материал! ура – Berryl