我在wpf中有一个视图,它有一系列不同的框,例如,名字/姓氏(TextBox),出生日期(DatePickers),婚姻状况(ComboBox)等。
我希望能够做的是将文本输入到TextBox中并在单独的视图中的TextBlock中显示它们。
我已经在追溯的ViewModel中添加了所有相应项目的属性,但从那里开始,我不确定如何进一步实现这一点。
我所看到的其他问题不是很清楚或很容易理解。
答案 0 :(得分:0)
您只需将两个视图的DataContext设置为ViewModel的同一个实例。
<StackPanel>
<Local.EditableView DataContext={Binding Person} />
<Local.ReadOnlyView DataContext={Binding Person} />
</StackPanel>
答案 1 :(得分:0)
有多种方法可以实现这一目标。我假设你没有使用像Caliburn.Micro这样的任何框架。
简单方法:
private string _lastName; public string LastName{ get{ return _lastName } set{ _lastName = value; SharedClass.LastName = value; } }
答案 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工具包。