приложение UWP (архитектура mvvm) У меня есть MainView , в котором есть коллекция в ViewModel , используемая для привязки к GridView на MainView и каждом элементе имеет TextBox с двухсторонней привязкой данных с Описание свойство класса Примечание .
Xaml TextBox каждого элемента сетки.
<TextBlock Text="{x:Bind Description,Mode=TwoWay}"
Свойство коллекции, используемое для привязки к ItemSource gridview.
public ObservableCollection<Note> Notes { get; }
и это класс Примечание
public class Note : Observable
{
private string _description;
public string Description
{
get => _description;
set => Set(ref _description, value, nameof(Description));
}
}
класс Observable предназначен для двухсторонней привязки данных.
public class Observable : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
{
if (Equals(storage, value))
{
return;
}
storage = value;
OnPropertyChanged(propertyName);
}
protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Теперь все до этой точки работает отлично, когда я изменяю текст в текстовом поле, оно также меняет значение Description.
Второй вид
Теперь у меня есть функция, в которой каждый GridViewItem имеет кнопку , которая открывает примечание в новом окне . и в этом новом окне есть только 1 TextBox, поэтому теперь вторичное представление и GridViewItem, открывшее это представление, используют один и тот же объект Note .
Этот текстовый блок в дополнительном представлении также имеет 2-стороннюю привязку данных с Описание примечания.
Проблема
Я хочу, чтобы независимо от того, редактировалось ли текстовое поле в виде сетки или текстовое поле во вторичном представлении, значение описания должно оставаться синхронизированным между этими 2 текстовыми полями, поэтому я попытался связать их 2 способами с одним и тем же объектом Note следовательно, один и тот же объект Description связан с ними обоими.
Здесь я ожидал ошибку, которая была Marshalling threading error , поэтому всякий раз, когда я пытаюсь изменить значение любого текстового поля, он пытался обновить пользовательский интерфейс в другом представлении (которое является другим потоком), что, конечно, не допускается.
Я знаю о CoreDisptcher
Я уже знаю о функции диспетчера UWP для безопасного межпоточного взаимодействия, у меня уже есть все настройки, и если я использую его обычным способом, я могу легко использовать его для обновления интерфейса между потоками, и он полностью работает. Но моя проблема заключается в следующей строке:
protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\
Исключение возникает при попытке вызвать PropertyChanged Я попытался заключить следующую строку в моем Диспетчере:
OnPropertyChanged(propertyName);
но Интерфейс INotify не позволяет мне иметь метод Set <>, который возвращает задачу, вместо этого он должен возвращать только объект, это точка, в которой я застрял, и я не знаю, как используйте Dispatcher в этом сценарии, пожалуйста, дайте мне знать, если есть какой-то лучший способ сделать это, кажется, этот способ может быть не таким эффективным.
Благодарю.