0

最初に3つのクラスがあります。

public class Setting

プロパティがあります:

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

2番:

public class SettingCollection

これは:

ObservableCollection<Setting>

第3:

public class SimObject

プロパティがあります:

string ID, SettingsCollection Settings;

私はビューを持っています:依存関係プロパティを持つSettingsDisplay.xaml:

SettingsCollection SimObjSettings;

設定のIDとその値をItemsContainer内のTextBoxに表示します。

私のMainWindowViewModelにはSimObjectJeffがあります。そして私が持っているビューで

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

これはすべて正常に機能します。

いつSetting Value変更され、いつ変更されるかを知る必要があります。これにより、が属するSimObject IDを知る必要があります。これにより、、、およびをSetting使用してイベントを送信するメソッドを呼び出すことができます。(例)Setting IDValueSimObject IDSendEvent(settingID, settingValue, targetObject)

明らかにSetting、'sとSettingCollection'sはそれらが何SimObjectに属しているかについての知識を持っていません。

私がこれを試みた方法は、ValueプロパティのSetterのSettingクラス呼び出しです。SendEvent

チェーンを下ってクラスに渡す適切な方法を見つけるSimObjectのに苦労しています。また、これは良い解決策ではないと思います。IDSetting

私がやろうとしていることを達成するための最良の方法は何ですか?

4

2 に答える 2

0

設定のSimObject所有者であるすべてSettingの'saプロパティを指定し、次の場所にイベントハンドラー を作成することで、これを解決することになりました。SimObjectdelegate 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);
}

次に、にイベントを追加し、メソッドも含むSettingsDisplaySelectedPropertyChangedCallbackを作成しました。ParameterChangedSimObjectSettingChanged

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とその中のすべての項目に接続します。SimObjectあなたがそれを表示する前StartObservingに、そしてビューが閉じられたときにあなたはStopObservingそれを閉じます。

于 2012-07-12T12:03:00.523 に答える