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

时间:2016-09-22 15:58:37

标签: c# wpf xaml mvvm prism

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

我希望能够做的是将文本输入到TextBox中并在单独的视图中的TextBlock中显示它们。

我已经在追溯的ViewModel中添加了所有相应项目的属性,但从那里开始,我不确定如何进一步实现这一点。

我所看到的其他问题不是很清楚或很容易理解。

5 个答案:

答案 0 :(得分:0)

您只需将两个视图的DataContext设置为ViewModel的同一个实例。

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

答案 1 :(得分:0)

有多种方法可以实现这一目标。我假设你没有使用像Caliburn.Micro这样的任何框架。

简单方法:

  1. 创建一个跨多个ViewModel共享信息的全局静态类。
  2. 现在,从第一个ViewModel,使用ViewModel属性setter更新静态类属性,类似
  3. private string _lastName;
    public string LastName{
      get{
          return _lastName
      }
      set{
          _lastName = value;
          SharedClass.LastName = value;
      }
    }
    
    1. 现在从其他ViewModel访问此共享类。

答案 2 :(得分:0)

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

您通常会为视图模型感兴趣的某些操作注册“目标”视图模型 - “同事” - 并为该操作发生时应该发生的操作提供回调操作。然后,另一个视图模型 - 执行目标感兴趣的操作的模型 - 将在操作发生时通知调解器,然后调解器将对为该操作注册的所有同事执行相关操作。 / p>

以下是调解员的一个例子:

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));
    }
}

答案 3 :(得分:0)

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

因此,当在一个视图中输入数据时,其视图模型会更新模型,模型更新会在另一个视图模型中触发更新,最后在另一个视图中触发更新。

答案 4 :(得分:0)

如果您有很多跨视图模型通信,请使用Messenger。这充当了调解人并简化了许多这样的问题。您可以自己实现一个,也可以使用MVVM light或Prism工具包。