propertychange in region from other 地区

propertychanged in region from other region

我正在使用 WPF + MVVMprismunity。 我有三个区域“menu”、“main”和“footer”。 现在我想在区域“main”中的 MainViewModel 中的 footerViewModel(区域“footer”)中设置一个 属性。这个 属性 应该显示在 footerView 中。 更改事件有效,但它不会更新 view.

中的 textbox

我希望有人能帮助我?

提前致谢。

这是我的 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是一个static object,提供共享信息

FooterViewModel:

    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 中绑定:

  <StatusBarItem Content="{Binding CurrentCodingSpecification, Mode=TwoWay}" HorizontalAlignment="Left" VerticalAlignment="Center" Width="200"/>

服务是解决这个问题的出路。创建一个共享服务,您可以将其注入所有视图模型(因此模拟!)。这管理状态并具有可以在值更改时通知虚拟机的事件。

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

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

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