我有三节课, 第一:
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
ID
,Value
和SimObject
ID
。 (例如SendEvent(settingID, settingValue, targetObject)
)
显然Setting
和SettingCollection
不知道他们属于哪个SimObject
。
我尝试这样做的方法是在Value属性的Setter中Setting
类调用SendEvent
。
我很难找到一种合适的方法将SimObject
的{{1}}传递到ID
的班级,我也不认为这是一个好的解决方案。
实现我想要做的最好的方法是什么?
答案 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);
在SimObject
:public 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);
}
不知道如何添加语法突出显示以使此答案更清晰。