Моя ситуация немного отличается от других постов, и я не смог решить ее с другими тредами. Так вот почему я спрашиваю.
У меня есть класс, полученный в результате десериализации 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 вида: один для отображения всех листьев и один для редактирования одного листа. Я реализовал коммит и откат, поэтому я использую обмен сообщениями для передачи новых значений и сохраняю старые.
Для этого я копирую объекты в резервную переменную, а затем изменяю объекты, связанные с помощью привязки к представлению 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 без каких-либо изменений.
Если я сохраняю изменения, выход из приложения и возвращаюсь, я вижу, что новое значение правильно сохранено
Не могли бы вы мне помочь?
Спасибо,
Massimo