簡體   English   中英

WPF在2個視圖模型之間共享字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM