私の状況は他の投稿と若干異なり、他のtrhreadsで解決できませんでした。それで私がなぜ尋ねるのか。MVVM Light - 子ネストされた編集から親ビューを更新することができません
私のようなXMLをデシリアライズから取得されたクラスを持っている:
<?xml version="1.0" encoding="UTF-8"?>
<node>
<leaf>
<name>node 1</name>
<text>text 1</text>
<url>url 1</url>
</leaf>
<leaf>
<name>node 2</name>
<text>text 2</text>
<url>url 2</url>
</leaf>
</node>
ので、クラスは次のとおりです。
[XmlRoot("node")]
public class csNodeList
{
public csNodeList()
{
Leaf = new csLeafCollection();
}
[XmlElement("leaf")]
public csLeafCollection Leaf
{
get;
set;
}
}
public class csLeaf
{
public csLeaf()
{
Name ="";
Description = "";
Address = "";
}
[XmlElement("name")]
public string Name
{
get;
set;
}
[XmlElement("text")]
public string Description
{
get;
set;
}
[XmlElement("url")]
public string Address
{
get;
set;
}
}
public class csLeafCollection : System.Collections.ObjectModel.ObservableCollection<csLeaf>
{
}
その後、私は2つのビュー、すべてのリーフを示すために1つずつを持っています1つのリーフを編集します。コミットとロールバックを実装していますので、新しい値を渡すために前後のメッセージングを使用し、古い値を格納します。
これを行うには、オブジェクトをバックアップ変数にコピーしてから、XAMLビューにバインドすることで関連付けられたオブジェクトを変更します。このように(理論上は)ViewModelデータへの変更が反映されます。 変更をコミットするとバックアップ変数(これは90%)が破棄され、バックアップ変数からロールバックする必要がある場合に便利です。
MAINVIEW:メッセージを使用して
public const string listPropertyName = "list";
private csNodeList _list = new csNodeList();
public csNodeList list
{
get
{
return _list;
}
set
{
Set(listPropertyName, ref _list, value, false);
}
}
私は、ノードの新しい値を返送し、私が正しい位置にそれらを置く:
private void DoSomething(csMessage message)
{
csMessage rmessage;
if (message != null)
{
switch (message.destination)
{
case csMessage.e2MessageDest.updateNode:
//_editP should be fine.
list.Leaf[list.Leaf.IndexOf(_editP)].Name = ((csLeaf)message.payload).Name;
list.Leaf[list.Leaf.IndexOf(_editP)].Text= ((csLeaf)message.payload).Text;
list.Leaf[list.Leaf.IndexOf(_editP)].Address = ((csLeaf)message.payload).Address;
RaisePropertyChanged(listPropertyName , null, _list, true);
break;
}
}
}
コードが正しく実行されると、アイテムがありますかわった。
しかし、RaisePropertyChangedは無視されます。私はlistPropertyNameで変更しなくても試してみました。私はアプリからの変更出口を保存し、私が正しく
を保存し、新しい値を参照してください取り戻す場合
あなたは私を助けてくださいことはできますか?
おかげで、 マッシモ
これはいいですが、MVVMのセットを使用していますが、モデルでも使用できますか? ViewModelレイヤーとModelレイヤーが「混ざり合っている」にもかかわらず、私はそれを試しませんでした。間違っていますか? –
その他の考え:ノードを追加または削除するとすぐに更新されます。コレクションはIObservableなので、それですか?アイテムをIObservableにすることはできますか? しかし、もう一度:これはViewModelレイヤをモデルレイヤで台無しにしていますか? –
通常、ViewModel(ViewModelBaseから継承)内にモデルをラップし、モデルの各プロパティのプロパティを実装します。これらのラッパー・プロパティーのそれぞれは、プロパティー変更通知機能を追加するようになりました。プロパティフィールド(この例では '_propertyField')に書き込む代わりに、モデルのプロパティ(つまり、' _model.Property')に書き込むことになります。また、**モデルで通知を実装することもできます**。個人的には、ビューに関連する追加のプロパティを許可するため、最初のアプローチを好みます。 – AxelEckenberger