我正在尝试开发一个具有两个窗口的简单MVVM项目:
FontSize
或BackgroundColor
:<TextBlock FontSize="{Binding EditorFontSize}"></TextBlock>
它的
DataContext
是 MainWindowViewModel :public class MainWindowViewModel : BindableBase
{
public int EditorFontSize
{
get { return _editorFontSize; }
set { SetProperty(ref _editorFontSize, value); }
}
.....
<Slider Maximum="30" Minimum="10" Value="{Binding EditorFontSize }" ></Slider>
其DataContext
是 OptionViewModel :public class OptionViewModel: BindableBase
{
public int EditorFontSize
{
get { return _editorFontSize; }
set { SetProperty(ref _editorFontSize, value); }
}
.....
我的问题是,我必须在选项窗口中获取滑块的值,然后必须使用该值修改TextBlock的FontSize属性。但是我不知道如何将字体大小从OptionViewModel发送到MainViewModel 。我认为我应该使用:
我希望你能帮助我。这是我的第一个MVVM项目,英语不是我的主要语言:S
谢谢
最佳答案
在 View 模型和许多点之间进行交流的方法有很多,什么才是最好的。您可以看到它是如何完成的:
我认为,最好的方法是使用
EventAggregator
框架的Prism
模式。棱镜简化了MVVM模式。 但是,如果您尚未使用Prism
,则可以使用 Rachel Lim's tutorial - simplified version of EventAggregator pattern by Rachel Lim. 。我强烈建议您使用瑞秋·林(Rachel Lim)的方法。如果使用Rachel Lim的教程,则应创建一个通用类:
public static class EventSystem
{...Here Publish and Subscribe methods to event...}
并将事件发布到您的
OptionViewModel
中:eventAggregator.GetEvent<ChangeStockEvent>().Publish(
new TickerSymbolSelectedMessage{ StockSymbol = “STOCK0” });
然后您订阅另一个
MainViewModel
的构造函数到一个事件:eventAggregator.GetEvent<ChangeStockEvent>().Subscribe(ShowNews);
public void ShowNews(TickerSymbolSelectedMessage msg)
{
// Handle Event
}
Rachel Lim的简化方法是我见过的最好的方法。但是,如果要创建一个大型应用程序,则应阅读此article by Magnus Montin和CSharpcorner with an example。
更新:对于版本低于5的
Prism
版本,在版本6中CompositePresentationEvent
已弃用并完全删除,因此您需要将其更改为PubSubEvent
,其他所有内容都可以保持不变。关于c# - 在不同的ViewModel之间共享数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35344436/