Silverlight viewmodel必须是公共的。我该怎么处理呢?

Silverlight viewmodel必须是公共的。我该怎么处理呢?,silverlight,xaml,Silverlight,Xaml,这里大致概括了我的问题: 我有controls.DLL,我希望保留此自定义控件绑定和viewmodel的内部。然而,这似乎是不可能的 你是怎么做到的?我看到它的唯一方式是——不要使用绑定。尝试受保护的内部。我想这应该行得通。尽管我认为ViewModel完全不公开不是一个好主意,但它的目的之一是能够针对同一个ViewModel定义多个视图,这些视图可能来自不同的程序集。尝试使用受保护的内部视图。我想这应该行得通。尽管我认为ViewModel完全不公开不是一个好主意,但它的目的之一是能够针对同一个

这里大致概括了我的问题:

我有controls.DLL,我希望保留此自定义控件绑定和viewmodel的内部。然而,这似乎是不可能的


你是怎么做到的?我看到它的唯一方式是——不要使用绑定。

尝试受保护的内部。我想这应该行得通。尽管我认为ViewModel完全不公开不是一个好主意,但它的目的之一是能够针对同一个ViewModel定义多个视图,这些视图可能来自不同的程序集。

尝试使用受保护的内部视图。我想这应该行得通。尽管我认为ViewModel完全不公开不是一个好主意,但它的目的之一是能够针对同一个ViewModel定义多个视图,这些视图可能来自不同的程序集。

为什么要为自定义控件提供视图模型?我假设您将视图模型对象分配给DataContext属性,但这几乎总是一个错误:消费者应该可以随意使用和滥用DataContext。换句话说,如果自定义控件的使用者显式设置DataContext,会发生什么情况?听起来您的控件将停止工作并抛出一系列xaml绑定错误

自定义控件本质上是无外观的。没有模型或视图模型,只有一个视图。该视图是.cs文件。您可以通过themes/generic.xaml文件提供默认外观,但消费者应该能够提供自己的模板。如果要将它们绑定到视图模型,它们还需要知道如何创建视图模型实例及其所有依赖项。您刚刚创建了高度耦合的代码。DI容器可以放松耦合,但这只是将类之间的关系从“耦合”降级为“相关”。我说,为什么消费者甚至需要知道这些信息

更好的方法是将控件的所有属性作为依赖项属性提供。然后,generic.xaml可以提供一个控件模板,该模板使用更高效的TemplateBinding将属性/对象绑定到控件。如果需要从业务对象填充这些依赖项属性,请公开IBusinessObject类型的另一个依赖项属性,并在该对象的PropertyMetaData更改处理程序中设置派生值。如果IBusinesObject类型包含的属性是另一个实现INotifyPropertyChanged的类,则可能应该(1)重新考虑对象图,或者(2)使用子类在代码中创建一个丁字对象


我认为遵循以上所有建议将消除您所关心的问题以及其他问题。将视图模型留给用户控件。是的,这就是为什么自定义控件是一个非常头痛的问题。正确处理这些问题相当复杂

为什么有自定义控件的视图模型?我假设您将视图模型对象分配给DataContext属性,但这几乎总是一个错误:消费者应该可以随意使用和滥用DataContext。换句话说,如果自定义控件的使用者显式设置DataContext,会发生什么情况?听起来您的控件将停止工作并抛出一系列xaml绑定错误

自定义控件本质上是无外观的。没有模型或视图模型,只有一个视图。该视图是.cs文件。您可以通过themes/generic.xaml文件提供默认外观,但消费者应该能够提供自己的模板。如果要将它们绑定到视图模型,它们还需要知道如何创建视图模型实例及其所有依赖项。您刚刚创建了高度耦合的代码。DI容器可以放松耦合,但这只是将类之间的关系从“耦合”降级为“相关”。我说,为什么消费者甚至需要知道这些信息

更好的方法是将控件的所有属性作为依赖项属性提供。然后,generic.xaml可以提供一个控件模板,该模板使用更高效的TemplateBinding将属性/对象绑定到控件。如果需要从业务对象填充这些依赖项属性,请公开IBusinessObject类型的另一个依赖项属性,并在该对象的PropertyMetaData更改处理程序中设置派生值。如果IBusinesObject类型包含的属性是另一个实现INotifyPropertyChanged的类,则可能应该(1)重新考虑对象图,或者(2)使用子类在代码中创建一个丁字对象


我认为遵循以上所有建议将消除您所关心的问题以及其他问题。将视图模型留给用户控件。是的,这就是为什么自定义控件是一个非常头痛的问题。正确处理这些问题相当复杂

在这种情况下,MVVM只是更易于编程,内部无法工作。属性和类都必须公开在这种情况下,MVVM只是更易于编程,内部不起作用。财产和阶级都必须公开,生活和学习。我只是从控制开始。我转向VM,因为我需要绑定,因此我必须设置DataContext。现在是哈哈!当我意识到TemplateBinding的依赖属性类似于通过DataContext绑定的常规属性时。我说得对吗?我有相当复杂的控制,我的也可以是用户控制。但我认为控制应该更有效?控件的用户是我们,所以我在这里并不真正关心。但同时我想把它做好。现在我明白了。我相信我会发布更多的问题:)如果你想允许或提供完全不同的控件外观,你会使用控件。例如,时钟控件可以提供基本的数字接口,但控件的使用者可以将其重新配置为具有模拟接口(甚至二进制接口)。如果你没有这种需要或愿望,不要使用自定义控制