如何从另一个ViewModel更新mainWindowViewModel的属性?

时间:2011-02-11 10:25:36

标签: wpf mvvm

从mainWIndow.xaml,它使用mainWindowViewModel作为DataContext,我打开一个名为addNewItem.xaml的新窗口,它使用ItemsViewModel作为DataContext。

在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>

我想将ItemsViewModel中的 SelectedHotel 传递给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 个答案:

答案 0 :(得分:1)

最后我找到了一个解决方案,这来自中介模式。我使用的是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"));
        }
    }

答案 1 :(得分:0)

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.

编辑:修正了一个拼写错误。