从其他窗口刷新combobox列表,MVVM

我正在处理一些应用程序,我有一个问题。 我有两个窗口(预订 – 父母和客人 – 孩子)。 在父窗口中,我有一个包含guest虚拟机列表的combobox和一个用于添加新guest虚拟机的按钮。 单击该按钮时,将打开“宾客窗口(子窗口)”。 在子窗口中,我将新的guest添加到数据库中,并且工作正常。 我的问题是:如何在子窗口中添加新的guest虚拟机后刷新/更新父窗口中的combobox列表? 我知道属性的更改应该反映在视图中而不从数据库中检索数据(由于绑定)。

Bookings.xaml

       

BookingsViewModel.cs

  private tblGuest guest; public tblGuest Guest // Selected guest from combo box { get { return guest; } set { guest = value; OnPropertyChanged("Guest"); } } private ObservableCollection guests; public ObservableCollection Guests // Guests list in the combo box { get { return guests; } set { guests = value; OnPropertyChanged("Guests"); } } public ICommand _btnAddGuest; public ICommand btnAddGuest // Command for opening child window { get { if (_btnAddGuest == null) { _btnAddGuest = new DelegateCommand(delegate() { try { Guests guest = new Guests(); guest.ShowDialog(); } catch { Trace.WriteLine("working...", "MyApp"); } }); } return _btnAddGuest; } } 

Guests.xaml

  

此按钮(在Guest.xaml窗口中)将新guest虚拟机添加到数据库中。

GuestViewModel.cs

  private tblGuest guest; public tblGuest Guest // Guest to be added into database { get { return guest; } set { guest = value; OnPropertyChanged("Guest"); } } public ICommand _btnAddGuest; public ICommand btnAddGuest // Command for adding new guest { get { if (_btnAddGuest == null) { _btnAddGuest = new DelegateCommand(delegate() { try { Service1Client wcf = new Service1Client(); wcf.AddGuest(Guest); // "AddGuest()" WCF method adds new guest to database wcf.Close(); } catch { Trace.WriteLine("working...", "MyApp"); } }); } return _btnAddGuest; } } 

如何解决这个问题呢? 有什么简单的方法吗? 请你详细解释一下你的解决方案,因为我是WPF,WCF和MVVM的新手……

最好的问候,弗拉基米尔

只需使用BookingsViewModelGuestViewModel已存在的连接即可。

以下建议未经过测试,但您会明白这一点

 public ICommand btnAddGuest // Command for opening child window { get { if (_btnAddGuest == null) { _btnAddGuest = new DelegateCommand(delegate() { try { Guests guest = new Guests(); guest.ShowDialog(); // Add some Logic here and an is save check property to your GuestVM // sample solution // var vm = guest.DataContext as GuestViewModel; // if(vm != null) // if(vm.IsSaved) // { // var model = vm.Guest as tblGuest; // Guests.Add(model); // will add him to your list // Guest = model // will add him at your selected Guest // } } catch { Trace.WriteLine("working...", "MyApp"); } }); } return _btnAddGuest; } } 

GuestViewModel类中保存BookingsViewModel实例,并在添加新Guest时调用BookingsViewModel.OnPropertyChanged("Guest") (在wcf.AddGuest(Guest);行之后)。

如果您从主窗口创建子窗口以及子视图模型,您可以查看窗口关闭事件,或者如果您需要在窗口关闭之前知道,您还可以订阅子窗口的属性更改事件窗口创建时,当子视图模型上的属性发生更改时,您可以检查它是否是您想要的属性。 如果是这样更新您的列表。

 ChildViewModel n = new ChildViewModel() n.PropertyChanged += new PropertyChangedEventHandler(n_PropertyChanged); void n_PropertyChanged(object sender, PropertyChangedEventArgs e) { if(e.PropertyName == "myChangingObject") //reload list } 

如果我正确理解问题 – 您希望从子窗口获取新的guest虚拟机并在父窗口中更新您的集合 – 那么有很多方法可以实现。

例如:

  1. 将事件“OnSuccessful”添加到GuestsViewModel,然后附加BookingsViewModel。

  2. 实现EventAggregator模式(订阅者 – 监听器)

  3. 关闭子窗口后刷新客户端(将其显示为modal dialog)。

一个简单的回调接口可以帮助您。 客户端应该订阅,如果服务器推送通知,则填充combobox或刷新。

这是一个教程: http : //idunno.org/archive/2008/05/29/wcf-callbacks-a-beginners-guide.aspx

我曾经创建了一个“登录”方法,并在服务器端存储每个客户端回调。 然后每当我需要使用推送通知时,我只使用这个存储的客户端回调。 在客户端,您可以根据需要处理收到的消息/事件。

好的,我在“GuestsViewModel.cs”中添加了这些行:

  private BookingsViewModel _BookingsViewModel; public BookingsViewModel BookViewModel // Property { get { return _BookingsViewModel; } set { _BookingsViewModel = value; OnPropertyChanged("BookViewModel"); } } public GuestsViewModel(BookingsViewModel bvm) // Constructor with one parameter { BookViewModel = bvm; } public ICommand _btnAddGuest; public ICommand btnAddGuest { get { if (_btnAddGuest == null) { _btnAddGuest = new DelegateCommand(delegate() { try { Service1Client wcf = new Service1Client(); wcf.AddGuest(Guest); BookingsViewModel.OnPropertyChanged("Guests"); // You said to add this wcf.Close(); } catch { Trace.WriteLine("working...", "MyApp"); } }); } return _btnAddGuest; } } 

你的意思是上面这样的吗? 这不起作用……我想我应该再添加一件东西? 对不起,也许这个问题很愚蠢,但我不知道如何解决这个问题……

此致,弗拉基米尔