我是stackoverflow的新手,对WPF来说相对较新。
我已经围绕着六种重要的模式和最佳实践(以及此处的大量帖子),但似乎无法找到我正在寻找的解决方案。
我的问题:WPF / .Net 4 / C# 我有一个文本处理器(类型编辑器E ),可以一次加载一个文档(类型文档D )(标记为 Editor.CurrentDocument )。多个UI控件绑定到文档的属性(所有依赖项属性),例如 Document.Title , Document.DateLastModification 。
现在我希望能够切换实际的Document实例,而无需取消钩子并重新挂钩所有事件处理程序。所以我想在切换它的实现时,Editor.CurrentDocument属性必须以某种方式保持其实例。
我尝试创建一个 SingleInstanceDocument 类,该类直接从Document继承并使用Singleton模式。但是后来我找不到将任何Document实例注入SingleInstanceDocument的方法,而不必在内部重新映射所有属性。
我在某种程度上被误导或错过了这里的观点吗?如果SingleInstanceDocument方法是一个可行的解决方案,有什么方法可以使用反射将所有可用的依赖项属性从内部Document重新映射到外部的SingleInstanceDocument shell?
非常感谢!
附录:
事实证明,通过在CurrentDocument主机对象上实现 INotifyPropertyChanged ,WPF / .NET已经提供了此处所需的功能。因此,更改当前文档会导致UI适当地更新其绑定控件。我很抱歉所有的困惑。
答案 0 :(得分:0)
首先,学习一些基本的MVVM模式。基本上在WPF-MVVM中只使用ObservableCollection和INotifyPropertyChanged interface。
此类型的集合实现了观察者模式,当您添加/删除或“选择”当前项目时,该模式会通知UI(View)的更新。
//in main ViewModel
private Ducument _currentDocument;
public Document CurrentDocument
{
get { return _currentDocument; }
set
{
_currentDocument = value;
NotifyPropertyChanged("CurrentDocument");
}
}
//stored all loaded documents as collection.
public ObservableCollection<Document> Documents { get; set; }
选择绑定 - 当前项目。
<ListBox ItemsSource="{Binding Path=Documents}" SelectedItem="{Binding Path=CurrentDocument}" DisplayMemberPath="Title">
<!-- //all Document.Title as listitem -->
</ListBox>
<!--// Editor's View -->
<ContentControl DataContext="{Binding Path=CurrentDocument}"></ContentControl>