两个viewmodel之间的WPF共享字符串

时间:2014-08-28 15:46:33

标签: c# wpf mvvm viewmodel

我是这个WPF世界的新手,我有以下情况:

我正在使用VLC和Caliburn.Micro开发一个与多媒体相关的应用程序,我遇到了一个问题,我需要TotalTime中的变量MainViewModel与{{1}共享} TextBox

这个变量每秒都会发生变化,因此必须每秒通知它。

SettingsViewModel

我曾尝试用事件来做,但我没有成功。

2 个答案:

答案 0 :(得分:0)

如果将SettingsViewModel作为属性(例如“设置”)嵌套在MainViewModel中,则可以将UI元素绑定到它,如下所示:

Text = "{Binding Path=Settings.TotalTime}"

如果将View的DataContext设置为MainViewModel的实例

答案 1 :(得分:-1)

一般来说,这个问题的解决方案是一个单例信使,两个视图模型在创建时都注入了它们(通常来自IoC容器)。在您的方案中,SettingsViewModel会订阅特定类型的邮件,例如TotalTimeChangedMessage,而MainViewModel会在TotalTime更改时发送该类型的邮件。该消息只包含TotalTime的当前值,例如:

public sealed class TotalTimeChangedMessage
{
    public string totalTime;

    public TotalTimeChangedMessage(string totalTime)
    {
        this.totalTime = totalTime;
    }

    public string TotalTime
    {
        get { return this.totalTime; }
    }
}

Caliburn.Micro包含一个event aggregator,可用于在视图模型之间以这种方式传递消息。您的MainViewModel会发送如下消息:

public class MainViewModel
{
    private readonly IEventAggregator _eventAggregator;

    public MainViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
    }

    public string TotalTime
    {
        set
        {
            this.totalTime = value;
            _eventAggregator.Publish(new TotalTimeChangedMessage(this.totalTime));
        }
    }
}

..而你的SettingsViewModel会像这样处理它:

public class SettingsViewModel: IHandle<TotalTimeChangedMessage>
{
    private readonly IEventAggregator eventAggregator;

    public SettingsViewModel(IEventAggregator eventAggregator)
    {
        this.eventAggregator = eventAggregator;
        this.eventAggregator.Subscribe(this);
    }

    public void Handle(TotalTimeChangedMessage message)
    {
        // Use message.TotalTime as necessary
    }
}