我正在尝试开发一个具有两个窗口的简单MVVM项目:

  • 第一个窗口是文本编辑器,在其中绑定(bind)了一些属性,例如FontSizeBackgroundColor:<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
    我认为我应该使用:
  • 共享模型
  • MainWindowViewModel中的一个模型,在OptionViewModel中此模型的引用
  • 其他系统,例如通知,消息...

  • 我希望你能帮助我。这是我的第一个MVVM项目,英语不是我的主要语言:S
    谢谢

    最佳答案

    在 View 模型和许多点之间进行交流的方法有很多,什么才是最好的。您可以看到它是如何完成的:

  • using MVVMLight
  • in Prism
  • by Caliburn

  • 我认为,最好的方法是使用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 MontinCSharpcorner with an example

    更新:对于版本低于5的Prism版本,在版本6中CompositePresentationEvent已弃用并完全删除,因此您需要将其更改为PubSubEvent,其他所有内容都可以保持不变。

    关于c# - 在不同的ViewModel之间共享数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35344436/

    10-10 21:24