Я создал новый класс, реализующий mvvm CommunityTollkit. Этот класс используется для заполнения наблюдаемой коллекции. Если я отредактирую элемент этой наблюдаемой коллекции, этот элемент не отобразит изменения в пользовательском интерфейсе.
это элемент класса:
public partial class CompactContactData : ObservableObject
{
public CompactContactData()
{
}
string id;
[JsonPropertyName("_id")]
public string Id
{
get => id; set => SetProperty(ref id, value);
}
[ObservableProperty] string _nominativo;
[ObservableProperty] string _strada;
[ObservableProperty] string _civico;
[ObservableProperty] string _cap;
[ObservableProperty] string _comune;
[ObservableProperty] string _provincia;
[ObservableProperty] string _provinciaSigla;
}
Это наблюдаемая коллекция:
ObservableCollection<CompactContactData> _oc=new();
это фрагмент для изменения значения свойств элемента. Он находится в методе действия:
private void UpdatedAction(ObjectReturnFromWebSocket<CompactContact> data)
{
if (data.Operazione == "Added" || data.Operazione == "Updated")
{
CompactContact contatto = data.Oggetto;
if (data.Operazione == "Added")
{
CompactContactData _c = new();
_dq.TryEnqueue(()=>contatto.SetPropertiesValue<CompactContact>(_c));//SetPropertiesValue is an extension method for set every property of item
_oc.Add(_c);
}
else
{
CompactContactData contattoToUpdate = _oc.Where(c => c.Id == contatto.Id).FirstOrDefault();
if (contattoToUpdate is not null)
{
_dq.TryEnqueue(() =>
{
contattoToUpdate.Cap=contatto.Cap;
contattoToUpdate.Civico=contatto.Civico;
contattoToUpdate.Comune=contatto.Comune;
contattoToUpdate.Nominativo = "aaaa";// not change the property value in observablecollection
contattoToUpdate.Nominativo = "test";// change the property value in observablecollection
contattoToUpdate.Provincia=contatto.Provincia;
contattoToUpdate.ProvinciaSigla = contatto.ProvinciaSigla;
contattoToUpdate.Strada=contatto.Strada;
//contatto.SetPropertiesValue<CompactContact>(contattoToUpdate);
});
}
}
}
else
{
var contattoToDelete = _oc.Where(c => data.Ids.Contains(c.Id));
if (contattoToDelete.Any())
{
foreach (var item in contattoToDelete)
{
_oc.Remove(item);
}
}
}
}
Этот же код отлично работает и в другом случае.





x:Bind по умолчанию — OneTime. Убедитесь, что выбран режим привязки TwoWay. Например:
<TextBox Text = "{x:Bind Nominativo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
Не обязательно. Но пересборка — это одна из вещей, которую стоит попробовать, если ваш код не работает должным образом. ;)
Ты прав, в конце концов. Как только я добавил «Mode=OneWay» в шаблон списка, все заработало как положено. Спасибо
Я только что попробовал код на другом компьютере, и он работает нормально. Почему? Мне нужно очистить решение на рабочем компьютере?