Как я могу обновить свойство mainWindowViewModel из другой ViewModel? - PullRequest
0 голосов
/ 11 февраля 2011

Из mainWIndow.xaml, который использует в качестве DataContext mainWindowViewModel, я открываю новое окно с именем addNewItem.xaml, которое использует в качестве DataContext ItemsViewModel.

В addNewItem.xaml у меня есть DataGrid

<DataGrid SelectedItem="{Binding Path=SelectedHotel}" ItemsSource="{Binding HotelsList}" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTemplateColumn Width="350" Header="Hotel" IsReadOnly="True">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Label Content="{Binding Path=Name}"></Label>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
               </DataGrid.Columns>
            </DataGrid>

Я хочу передать SelectedHotel из ItemsViewModel в mainWindowViewModel.

Я попытался сделать это с помощью следующего кода (без удачи)

    //This is a property from ItemsViewModel
    private Hotel _selectedHotel { get; set; }
    public Hotel SelectedHotel {
        get { return _selectedHotel; }
        set {
            _selectedHotel = value;
            RaisePropertyChanged("SelectedHotel");
            OnSelectedItemChanged();
        }
    }
   void OnSelectedItemChanged() {
        MainWIndowViewModel = new MainWIndowViewModel(this.SelectedHotel);
    }

В mainWIndowViewModel у меня также есть еще одно свойство (с тем же именем, SelectedHotel), которое получает значение через конструктор

 public MainWIndowViewModel(Hotel selectedHotel)
        : this(new ModalDialogService()) {
        this.SelectedHotel = selectedHotel;
    } 

В mainWindow.xaml я хочу отобразить значение свойства

<Label Content="{Binding SelectedHotel.Name}" DockPanel.Dock="Top"></Label>

что я делаю не так?

В общем, мне нужно знать правило делать что-то подобное.

Как я могу уведомить свойство из другого свойства?

Спасибо

Решение

Я решаю это с помощью сообщений от mvvm light.

Ответы [ 2 ]

1 голос
/ 12 февраля 2011

Наконец-то я нашел решение, и это происходит из паттерна посредника.Я использую mvvmLight.

В mainWindowViewModel я зарегистрировал сообщение (я не знаю, является ли термин сообщения правильным)

 public MainWIndowViewModel(IDialogService dialog) {
        this._dialog = dialog;
        Messenger.Default.Register<NotificationMessage<Hotel>>(this, NotificationMessageReceived);
    }

    private void NotificationMessageReceived(NotificationMessage<Hotel> selectedHotel) {
        this.SelectedHotel = selectedHotel.Content;
    }

отдругой viewModel, я отправляю сообщение с SelectedHotel.

private Hotel _selectedHotel { get; set; }
    public Hotel SelectedHotel {
        get { return _selectedHotel; }
        set {
            _selectedHotel = value;
            RaisePropertyChanged("SelectedHotel");
            Messenger.Default.Send(new NotificationMessage<Hotel>(this, SelectedHotel, "SelectedHotel"));
        }
    }
0 голосов
/ 11 февраля 2011

В ItemsViewModel вам вообще не нужен код обработчика OnSelecetedItemChanged.Вместо этого в MainWindowViewModel сохраните ссылку на ItemsViewModel и добавьте туда обработчик:

var ItemsViewModel = itemsVM = new ItemsViewModel();
itemsVm.PropertyChanged += SelectedHotelChanged;

// and then implement the handler:

public void SelectedHotelChanged(object sender, PropertyChangedEventArgs args)
{
     SelectedHotel = itemsVM.SelectedHotel;  
}

// ensuring that the SelectedHotel property in the MainWindowViewModel also notifies when it changes.

Редактировать: Исправлена ​​опечатка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...