在其他地区的地区变化

时间:2015-06-02 08:09:54

标签: c# wpf mvvm prism-5

我正在使用WPF + MVVMprismunity。 我有三个区域“menu”,“main”和“footer”。 现在,我想在区域“footerViewModel”中footer的{​​{1}}(区域“MainViewModel”)中设置一个属性。此属性应显示在main中。 更改事件有效,但不会更新footerView中的textbox

我希望有人可以帮助我吗?

提前致谢。

这是我的view

MainViewModel

注意private CodingGuidline _selectedGuidline; public CodingGuidline SelectedGuidline { get { return _selectedGuidline; } set { _selectedGuidline = value; OnPropertyChanged(() => SelectedGuidline); OnUpdateAppCodingSpecification(this, EventArgs.Empty); } } private async void OnUpdateAppCodingSpecification(object sender, EventArgs args) { try { Task<CodingGuidline> result = CodingRepository.GetCodingSpecification(SelectedGuidline.Guid); _application.CurrentGuidline = await result; _container.Resolve<FooterViewModel>().OnUpdateCodingGuidline(this, EventArgs.Empty); } catch (Exception exception) { MessageBox.Show(exception.ToString()); } } _application,提供共享信息

FooterViewModel:

static object

public FooterViewModel(IUnityContainer container) { _container = container; _application = _container.Resolve<IApplication>(); AssemblyVersion = "Version: " + Assembly.GetExecutingAssembly().GetName().Version; WebserviceUrl = "Host: " + _application.WebserviceUrl; UpdateCodingGuidline += OnUpdateCodingGuidline; } public event EventHandler UpdateCodingGuidline; public void OnUpdateCodingGuidline(object sender, EventArgs args) { if (_application.CurrentGuidline != null) { CurrentCodingSpecification = _application.CurrentGuidline.SequenceNumber + " " + _application.CurrentGuidline.Name; } else { CurrentCodingSpecification = " - "; } } private string _currentCodingSpecification; public string CurrentCodingSpecification { get { return _currentCodingSpecification; } set { if (value != _currentCodingSpecification) { _currentCodingSpecification = value; OnPropertyChanged(() => CurrentCodingSpecification); MessageBox.Show(CurrentCodingSpecification.ToString()); } } } 出现,但Messagebox没有显示更改。

view中的绑定:

FooterView

1 个答案:

答案 0 :(得分:0)

服务是解决此问题的方法。创建一个可以注入所有视图模型的共享服务(因此模拟!)。这管理状态并具有可在值发生变化时通知vm的事件。

在vm初始化期间,您可以订阅该服务。当vm关闭时,您可以再次取消订阅以防止内存泄漏。

有点偏离主题,但这里有一些改进MVVM编码的技巧:

  1. 而不是注入容器,注入服务(不要隐藏你真正需要的东西),这使得测试和其他开发变得更加容易
  2. 使用MessageBox.Show在vm中并不聪明。在测试过程中应该如何表现?请改为使用服务(例如,IMessageService)。然后,如果您需要更改消息框的显示方式,则有1个位置供您查看)。你可以模拟消息(甚至是结果代码)。