【发布时间】:2011-11-04 00:01:38
【问题描述】:
它在这里总结了我的问题: Double check - does it ever make sense to have internal viewmodel class?
我有controls.DLL,我想保留这个自定义控件绑定和视图模型的内部。但是,这似乎是不可能的。
你如何解决这个问题?我看到它的唯一方式 - 不要使用绑定..
【问题讨论】:
标签: silverlight xaml
它在这里总结了我的问题: Double check - does it ever make sense to have internal viewmodel class?
我有controls.DLL,我想保留这个自定义控件绑定和视图模型的内部。但是,这似乎是不可能的。
你如何解决这个问题?我看到它的唯一方式 - 不要使用绑定..
【问题讨论】:
标签: silverlight xaml
为什么你有一个自定义控件的视图模型?我假设您将视图模型对象分配给 DataContext 属性,但这几乎总是一个错误:DataContext 应该可供消费者随意使用和滥用。换句话说,如果自定义控件的使用者显式设置 DataContext 会发生什么?听起来您的控件将停止工作并引发一堆 xaml 绑定错误。
自定义控件本质上是无形的。没有模型或视图模型,只有一个视图。该视图是 .cs 文件。您通过主题/generic.xaml 文件提供默认外观,但消费者应该能够提供他们自己的模板。如果您将它们绑定到视图模型,它们还需要知道如何创建视图模型实例及其所有依赖项。您刚刚创建了高度耦合的代码。 DI 容器可以放松耦合,但这只是将类之间的关系从“耦合”降级为“相关”。我说,为什么消费者甚至需要知道这些信息?
更好的方法是为您的控件提供所有属性作为依赖属性。然后您的 generic.xaml 可以提供一个控件模板,该模板使用更有效的 TemplateBinding 将属性/对象绑定到您的控件。如果您需要从业务对象填充这些依赖项属性,请公开 IBusinessObject 类型的另一个依赖项属性并在该对象的 PropertyMetaData 更改处理程序中设置派生值。如果您的 IBusinessObject 类型包含另一个实现 INotifyPropertyChanged 的类的属性,您可能应该 (1) 重新考虑您的对象图或 (2) 使用子类在代码中创建 Bnding 对象。
我认为遵循上述所有建议将消除您担心的问题以及其他问题。将视图模型留给 UserControls。是的,这就是为什么自定义控件令人头疼的原因。把它们做好是相当重要的。
【讨论】:
尝试受保护的内部。我想这应该可行。虽然我认为完全不公开 ViewModel 并不是一个好主意,因为它的目的之一是能够针对同一个 ViewModel 定义多个 View,这些 ViewModel 可能来自不同的程序集。
【讨论】: