【问题标题】:How should I pass property values from View to Model in MVVM?我应该如何将属性值从视图传递到 MVVM 中的模型?
【发布时间】:2012-07-12 11:45:06
【问题描述】:

我有三门课, 第一:

public class Setting

具有属性:

string ID, string Value; (implements INotifyPropertyChanged on Value)

第二:

public class SettingCollection

这是一个:

ObservableCollection<Setting>

第三:

public class SimObject

具有属性:

string ID, SettingsCollection Settings;

我有一个观点: 设置显示.xaml 具有依赖属性:

SettingsCollection SimObjSettings;

并在 ItemsContainer 内的 TextBox 中显示设置的 ID 及其值。

我的 MainWindow ViewModel 有一个 SimObject Jeff;在视图中我有

<local:SettingsDisplay SimObjSettings="{Binding Jeff.Settings}"/>

这一切都很好。

我需要知道 Setting Value 何时发生变化,以及何时发生这种情况我需要知道 Setting 所属的 SimObject ID,以便我可以调用一个方法来发送带有 Setting @ 的事件987654336@、ValueSimObject ID。 (例如SendEvent(settingID, settingValue, targetObject)

显然SettingSettingCollection 不知道SimObject 属于什么。

我尝试这样做的方法是在 Value 属性的 Setter 中的 Setting 类调用 SendEvent 中。

我正在努力寻找一种合适的方式将SimObjectID 向下传递到Setting 的班级,我也不认为这是一个好的解决方案。

实现我想要做的最好的方法是什么?

【问题讨论】:

  • “我需要将实时值更改发送到另一个系统” - 你的意思是另一个应用程序?你能指定这个吗?
  • 听起来您正在寻找某种事件消息传递系统。我建议您查看 Prism 的 EventAggregator 或 MVVM Light 的 Messenger。然后,您可以在值更改时广播更改,任何关心监听这些更改的人都可以订阅接收这些事件消息。如果你有兴趣,我在我的博客上有一个关于event systems in MVVM 的简短摘要。
  • @blindmeis 很抱歉澄清一下,我有一个非托管 DLL,我通过 CLR 接口与之通信。
  • @Rachel 我不确定这些事件消息系统对我的情况有何帮助,我会订阅什么?
  • @user13070 您更改的对象会发布一条事件消息,说明它们已更改。任何需要通知的东西都会订阅接收这种消息。我链接的两个库都有一个处理事件消息的对象(EventAggregatorMessenger),您可以使用该对象发布或订阅消息

标签: wpf mvvm view viewmodel


【解决方案1】:

有很多方法可以做到这一点,但显然所有这些方法都涉及观察SettingsCollection 动态附加/分离PropertyChanged处理程序到其中的所有项目(至少这是你的要求听起来不错)。

我认为,如果您想要的只是无条件的实时更新,那么您根本不应该在其中涉及 Views 和 ViewModels。只需编写一个类似这样的实现:

interface ISimObjLiveUpdateService
{
    void StartObserving(SimObject o);
    bool IsObserving(SimObject o);
    bool StopObserving(SimObject o);
}

实际的实现将连接到观察o.SettingsCollection 和其中的所有项目。在你显示SimObject之前你StartObserving它,当视图关闭时你StopObserving它。

【讨论】:

  • 是否有您提供的解决方案类型的名称以便我可以研究它,因为我不完全理解从您提供的内容到监控 SimObject 设置的值更改的步骤从接口的实现。但这听起来正是我所需要的,谢谢。
  • 它被称为“观察者模式”,但这确实是最一般意义上的。 C# 的事件模拟了这种模式。
【解决方案2】:

我最终通过为所有 Setting 提供 SimObject 属性(该属性是设置的 SimObject 所有者)并创建一个事件处理程序 delegate void SettingHandler(string settingID, string settingValue, string targetObj); 来解决这个问题 在SimObjectpublic event SettingHandler SettingChanged;

public void RaiseSettingChangedEvent(string settingId, string settingValue, string targetObj)
{
    if (SettingChanged != null)
    {
        SettingChanged(settingId, settingValue, targetObj);
    }
}

Setting 上的string Value 二传手:

set
{
   _value = value;
   RaisePropertyChanged("Value");
   SimObject.RaiseSettingChangedEvent(ID, Value, SimObject.Settings["UID"].Value);
}

然后在SettingsDisplay 中,我创建了一个SelectedPropertyChangedCallback,它将ParameterChanged 事件添加到SimObject,并且还包含SettingChanged 方法:

public void SettingChanged(string settingID, string settingValue, string targetObj)
{
    Framework.GetBusinessDelegate().SendEvent(settingID, settingValue, targetObj);
}

不知道如何添加语法高亮以使这个答案更清晰。

【讨论】:

    猜你喜欢
    • 2011-10-22
    • 2017-10-04
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多