【发布时间】:2019-02-15 05:41:38
【问题描述】:
UWP 应用(mvvm 架构)我有一个 MainView,它的 ViewModel 中有一个集合,用于绑定到 MainView 上的 GridView每个项目都有一个 TextBox,具有 2 路数据绑定,具有 Note 类的 Description 属性。
每个gridviewitem的TextBox的Xaml。
<TextBlock Text="{x:Bind Description,Mode=TwoWay}"
用于绑定到gridview的ItemSource的集合属性。
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));
}
现在一切正常,当我更改文本框中的文本时,它也会更改描述的值。
第二次查看
现在我有一个功能,其中每个 GridViewItem 都有一个 按钮,它可以在 新窗口 中打开注释。而这个新窗口只有 1 个 TextBox,所以现在辅助视图和打开该视图的 GridViewItem 使用的是 Note 的相同对象。
辅助视图中的此文本框还具有与 Note 的 描述 的 2 路数据绑定。
问题
我想要的是,无论gridview中的文本框还是辅助视图上的文本框被编辑,描述的值必须在这两个文本框之间保持同步,这就是为什么我试图将它们与同一个对象绑定2种注意因此,相同的 Description 对象绑定到它们两者。
这里的错误对我来说是编组线程错误,所以每当我尝试更改任何文本框的值时,它都会尝试更新其他视图(这是另一个线程)上的 UI,这当然是不允许。
我知道 CoreDisptcher
我已经知道 UWP 用于安全跨线程通信的 Dispatcher 功能,我已经完成了所有设置,如果我通过常规方法使用它,我可以轻松地将它用于跨线程 UI 更新,它完全可以工作。但我的问题是以下行:
protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\
当它试图调用 PropertyChanged 我试图在我的 Dispatcher 中包装以下行时发生异常:
OnPropertyChanged(propertyName);
但是 INotify 接口不允许我有一个返回 Task 的 Set 方法,它只需要返回一个对象,这就是我卡住的地方,我不知道怎么做要在这种情况下使用 Dispatcher,请让我知道是否有更好的方法可以做到这一点,看来这种方式可能效率不高。 谢谢。
【问题讨论】:
标签: c# multithreading uwp dispatcher multiviews