propertychange in region from other 地区
propertychanged in region from other region
我正在使用 WPF + MVVM
与 prism
和 unity
。
我有三个区域“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 编码的技巧:
- 注入服务而不是注入容器(不要隐藏你真正需要的东西),这使得测试和其他开发更容易
- 在 vm 中使用 MessageBox.Show 并不明智。它在测试期间应该如何表现?为此使用服务(例如,IMessageService)。然后,如果您需要更改消息框的显示方式,可以查看 1 个位置)。您可以模拟消息(甚至结果代码)。
我正在使用 WPF + MVVM
与 prism
和 unity
。
我有三个区域“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 编码的技巧:
- 注入服务而不是注入容器(不要隐藏你真正需要的东西),这使得测试和其他开发更容易
- 在 vm 中使用 MessageBox.Show 并不明智。它在测试期间应该如何表现?为此使用服务(例如,IMessageService)。然后,如果您需要更改消息框的显示方式,可以查看 1 个位置)。您可以模拟消息(甚至结果代码)。