0

我正在WPF + MVVM使用prismunity。我有三个区域“ menu”、“ main”和“ footer”。现在我想在区域“”中设置footerViewModel(区域“ footer”)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());
  }

}

注意_applicationstatic 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());
    }
  }
}

出现Messageboxview不显示变化。

绑定FooterView

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

1 回答 1

0

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

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

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

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