从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的消息解决它。
答案 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.
编辑:修正了一个拼写错误。