我应该如何在MVVM中将属性值从View传递给Model?

时间:2012-07-12 11:45:07

标签: wpf mvvm view viewmodel

我有三节课, 第一:

public class Setting

具有属性:

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

第二

public class SettingCollection

这是:

ObservableCollection<Setting>

第三

public class SimObject

具有属性:

string ID, SettingsCollection Settings;

我有一个观点: SettingsDisplay.xaml 它有依赖属性:

SettingsCollection SimObjSettings;

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

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

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

一切正常。

我需要知道Setting Value何时发生更改,何时发生这种情况我需要知道Setting所属的SimObject ID,以便我可以调用发送事件的方法使用Setting IDValueSimObject ID。 (例如SendEvent(settingID, settingValue, targetObject)

显然SettingSettingCollection不知道他们属于哪个SimObject

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

我很难找到一种合适的方法将SimObject的{​​{1}}传递到ID的班级,我也不认为这是一个好的解决方案。

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

2 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,但显然所有这些都涉及有人观察SettingsCollection 动态地将PropertyChanged处理程序附加/分离到其中的所有项目(至少那是你的要求对我而言的声音。)

我认为,如果你想要的只是无条件的直播,你就不应该参与View和ViewModel。只需编写类似这样的实现:

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

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

答案 1 :(得分:0)

我最后通过给所有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 Setter上的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);
}

不知道如何添加语法突出显示以使此答案更清晰。