繁体   English   中英

如何从一个视图访问TextBox中的文本,并在WPF C#中在另一个视图的TextBlock中显示文本

[英]How to access text from a TextBox from one view and display it in a TextBlock on another view in WPF C#

我在wpf中有一个视图,其中包含一系列不同的框,例如,名字/姓氏(TextBox),出生日期(DatePickers),婚姻状况(ComboBox)等。

我想要做的是将文本输入到TextBoxes中,并在单独的视图上的TextBlock中显示它们。

我在追溯的ViewModels中添加了所有对应项的属性,但是从那以后,我不确定如何进一步实现此功能。

我看过的其他问题不太清楚或难以理解。

您只需要将两个视图的DataContext设置为ViewModel的相同实例即可。

<StackPanel>
    <Local.EditableView DataContext={Binding Person} />
    <Local.ReadOnlyView DataContext={Binding Person} />
</StackPanel>

有多种方法可以实现此目的。 我假设您没有使用任何类似Caliburn.Micro的框架。

简单方法:

  1. 创建一个全局静态类,该类在多个ViewModel之间共享信息。
  2. 现在,从第一个ViewModel开始,使用ViewModel属性设置器更新静态类属性,例如
 private string _lastName; public string LastName{ get{ return _lastName } set{ _lastName = value; SharedClass.LastName = value; } } 
  1. 现在,从另一个ViewModel访问此共享的类。

一种方法是使用调解器在视图模型之间进行通信。

通常,您将向调解员注册“目标”视图模型(“同事”)以进行视图模型感兴趣的某些操作,并为该操作发生时应该发生的事件提供回调操作。 然后,另一视图模型(执行目标感兴趣的操作的视图模型)将在操作发生时通知中介,然后中介将对为此操作注册的所有同事执行关联的操作。

这是调解员的示例:

static class Mediator
{
    private static Dictionary<string, List<Action<Object>>> _tokenCallbacks 
        = new Dictionary<string, List<Action<object>>>();

    internal static void Register(string token, Action<Object> callback)
    {
        token = token.ToLower();

        if (_tokenCallbacks.ContainsKey(token))
        {
            var l = _tokenCallbacks[token];
            var found = false;

            foreach (var existingCallback in l)
            {
                if (existingCallback.Equals(callback))
                {
                    found = true;
                    break;
                }
            }

            if (!found) l.Add(callback);
        }
        else
        {
            var l = new List<Action<Object>>(new[] { callback });
            _tokenCallbacks.Add(token, l);
        }
    }

    internal static void NotifyColleagues(string callbackToken, Object args)
    {
        callbackToken = callbackToken.ToLower();

        if (_tokenCallbacks.ContainsKey(callbackToken)) 
            _tokenCallbacks[callbackToken].ForEach((x) => x(args));
    }
}

这些视图及其视图模型应引用数据的共享模型。

这样,当在一个视图中输入数据时,其视图模型将更新模型,并且模型更新会触发另一个视图模型中的更新,并最终触发另一个视图中的更新。

如果您有很多跨视图模型通信,请使用Messenger。 那充当了调解者,简化了很多类似的问题。 您既可以自己实施,也可以使用MVVM light或Prism工具箱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM