Зарегистрироваться на конкретное измененное свойство в MVVM Light на WP7 - PullRequest
0 голосов
/ 30 декабря 2010

Я создал вид со списком, который показывает коллекцию автомобилей на нем. Если пользователь нажимает на конкретную машину, его нужно отправить в другое представление с подробной информацией о нем. Свойства привязки - это обычные свойства MVVM Light (с RaisePropertyChanged и всеми). Некоторые фрагменты кода:

<ListBox ItemsSource="{Binding Cars}" SelectedItem="{Binding SelectedCar, Mode=TwoWay}">

При разработке этого приложения я обнаружил, что могу зарегистрироваться для событий, изменяющих свойства, используя объект Messenger из MVVM Light, например:

Messenger.Default.Register<PropertyChangedMessage<Car>>(this, (action) =>
{
    Deployment.Current.Dispatcher.BeginInvoke(() =>
    {
        DoViewDetail();
    });
});

Но если я прав, это будет регистрироваться для каждого измененного автомобиля во всем приложении. Вероятно, можно что-то сделать с RaisePropertyChanged или Register, чтобы вы могли нацелить определенное свойство, но я не могу найти его.

Кто-нибудь здесь получил ключ или голову? Вкратце: я хочу зарегистрироваться для определенного свойства, а не для определенного объекта в приложении MVVM Light.

1 Ответ

2 голосов
/ 31 декабря 2010

Я думаю, что одной из альтернатив является создание собственного «сообщения» для использования только в связи с желаемой функциональностью. Например, объявите CarSelectedMessage и затем вместо использования широковещания по умолчанию PropertyChangedMessage<Car> создайте и отправьте пользовательское сообщение из модели представления:

public Car SelectedCar { 
    get { return _selectedCar; }
    set { 
        _selectedCar = value;
        RaisePropertyChanged("SelectedCar");

        var msg = new CarSelectedMessage(value);
        Messenger.Default.Send(msg);
    }
}

По навигации вообще

Для реализации навигации в приложении я следовал этой записи блога , чтобы упростить выдачу запросов на навигацию из моделей представлений. Я думаю, что его нужно было немного обновить для последней версии MVVM Light, см. Мою версию ниже.

Новый NavigationRequest класс для использования в качестве сообщения:

public class NavigationRequest
{
    public NavigationRequest(Uri uri)
    {
        DestinationAddress = uri;
    }

    public Uri DestinationAddress
    {
        get;
        private set;
    }
}

Регистрация запросов в конструкторе основного вида приложения:

Messenger.Default.Register<NavigationRequest>(this, 
    (request) => DispatcherHelper.CheckBeginInvokeOnUI(
         () => NavigationService.Navigate(request.DestinationAddress)));

Наконец, для вызова навигации из модели вида

var uri = new Uri("/MyPage.xaml", UriKind.Relative);
Messenger.Default.Send(new NavigationRequest(uri));

Надеюсь, это поможет,

...