[英]WPF share string between 2 viewmodels
我是WPF世界中的新手,我遇到以下情況:
我正在使用VLC和Caliburn.Micro開發與多媒體相關的應用程序,遇到一個問題,我需要MainViewModel
TotalTime
變量與SettingsViewModel
上的TextBox
共享。
該變量恰好每秒更改一次,因此必須每秒通知一次。
MainViewModel -> string TotalTime
SettingsViewModel -> TextBox Time
我已經嘗試通過事件來做到這一點,但沒有成功。
如果將SettingsViewModel作為屬性嵌套在MainViewModel中(例如Settings),則可以將UI元素綁定到它,如下所示:
Text = "{Binding Path=Settings.TotalTime}"
如果View的DataContext設置為MainViewModel的實例
通常,解決此問題的方法是使用單例Messenger,兩個視圖模型在創建時都已將其注入(通常是從IoC容器中)。 在您的方案中, SettingsViewModel
會訂閱特定類型的消息,例如TotalTimeChangedMessage
,並且只要TotalTime
更改, MainViewModel
就會發送該類型的消息。 該消息僅包含TotalTime
的當前值,例如:
public sealed class TotalTimeChangedMessage
{
public string totalTime;
public TotalTimeChangedMessage(string totalTime)
{
this.totalTime = totalTime;
}
public string TotalTime
{
get { return this.totalTime; }
}
}
Caliburn.Micro包含一個事件聚合器 ,您可以使用它在視圖模型之間以這種方式傳遞消息。 您的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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.