我是这个WPF世界的新手,我有以下情况:
我正在使用VLC和Caliburn.Micro开发一个与多媒体相关的应用程序,我遇到了一个问题,我需要TotalTime
中的变量MainViewModel
与{{1}共享} TextBox
。
这个变量每秒都会发生变化,因此必须每秒通知它。
SettingsViewModel
我曾尝试用事件来做,但我没有成功。
答案 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
}
}