0

我有三门课,首先:

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 及其值。

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

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

这一切都很好。

我需要知道何时发生Setting Value更改以及何时发生更改,我需要知道Setting所属的 SimObject ID,以便我可以调用一个方法来发送带有Setting IDValue的事件SimObject ID。(例如SendEvent(settingID, settingValue, targetObject)

显然Setting's 和SettingCollection's 不知道SimObject它们属于什么。

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

我正在努力寻找一种合适的方式将SimObject'传递IDSetting' 类,我也不认为这是一个好的解决方案。

实现我想要做的事情的最佳方法是什么?

4

2 回答 2

0

我最终通过提供所有Setting'sa属性(即设置的 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);
    }
}

在二传手Settingstring 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);
}

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

于 2012-08-08T18:15:00.370 回答
0

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

我会争辩说,如果您想要的只是无条件的实时更新,那么您根本不应该在其中涉及 Views 和 ViewModels。简单地写一个这样的实现:

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

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

于 2012-07-12T12:03:00.523 回答