C# 将CustomControl DependencyProperty绑定到ViewModel枚举
我正在尝试创建一个CustomControl,它将具有受ViewModel中的枚举影响的各种属性。创建的CustomControl将在视图中调用 我希望enum绑定可以更改控件中的一些内容,包括:C# 将CustomControl DependencyProperty绑定到ViewModel枚举,c#,wpf,mvvm,enums,custom-controls,C#,Wpf,Mvvm,Enums,Custom Controls,我正在尝试创建一个CustomControl,它将具有受ViewModel中的枚举影响的各种属性。创建的CustomControl将在视图中调用 我希望enum绑定可以更改控件中的一些内容,包括: 更改图像源(更改为的图像在CustomControl库中创建的文件夹中是静态的) 更改TextBlocks Text属性,同样,文本选项将在X个案例中的一个案例之间保持静态(X是可能的枚举状态数(也不会更改)) 请记住,这两个DP将被链接,例如,如果绑定枚举为案例x,则图像源将改变显示的文本。 基
- 更改图像源(更改为的图像在CustomControl库中创建的文件夹中是静态的)
- 更改TextBlocks Text属性,同样,文本选项将在X个案例中的一个案例之间保持静态(X是可能的枚举状态数(也不会更改))
因此,我的问题是,携带上述物品的最佳方式是什么 我已经考虑过两种可能的方法:
提前感谢您的回复,我将尽可能多地更新此问题,并提供有关问题个人进展的回复和更新,以及可能需要的额外信息 您的两种解决方案都应该可以正常工作 对于第二种解决方案,您只需将dependecy属性注册为: 检查此线程是否使用了
FrameworkPropertyMetadata
、UIPropertyMetadata
和PropertyMetadata
第一个解决方案的优点是它很轻,您只需要2个valueconverter
,不需要依赖性属性,这样其他开发人员就可以通过查看xaml
了解枚举和这些属性之间的紧密依赖性。
缺点是,如果您计划在多个位置使用具有相同逻辑的自定义控件,那么复制粘贴这些转换器不是很整洁
第二种解决方案与第一种解决方案类似,您具有更高级别的可重用性,但您的逻辑深入到您的控制中。两种解决方案都应该可以正常工作 对于第二种解决方案,您只需将dependecy属性注册为: 检查此线程是否使用了
FrameworkPropertyMetadata
、UIPropertyMetadata
和PropertyMetadata
第一个解决方案的优点是它很轻,您只需要2个valueconverter
,不需要依赖性属性,这样其他开发人员就可以通过查看xaml
了解枚举和这些属性之间的紧密依赖性。
缺点是,如果您计划在多个位置使用具有相同逻辑的自定义控件,那么复制粘贴这些转换器不是很整洁
第二个解决方案是第一个解决方案的镜像,您具有更高级别的可重用性,但您的逻辑深深嵌入到您的控制中。非常感谢您的快速回复。只有一个问题,使用您建议的方法,我是否必须在CustomControls代码中创建一个与我的ViewModel中的枚举列表重复的枚举列表,以便它们都包含相同的元素?否,您需要将新的依赖项属性绑定到ViewModel。绑定是在目标和源之间创建连接的一种方式,因此您不必复制任何内容。问题是,我不知道在创建DependencyProperty时分配它的类型,因为VM中的枚举类型在我的CustomControl中不可用<代码>DependencyProperty.Register(“MyProperty”、typeof(EnumType)、typeof(MyClass)、new PropertyMetadata(new PropertyChangedCallback(MyPropertyChangedHandler))代码>-此处的“枚举类型”应替换为什么?对不起,我弄糊涂了!它应该是您的枚举类型;为什么它在CustomControl中不可用?如果您的自定义控件无法使用它,那么您可能应该坚持使用解决方案1转换器。我不确定为什么无法访问我创建的枚举类型,我对编程相当陌生!无论如何,我添加了对ViewModelLibrary的引用,其中包含我需要的枚举类型,并将相应的using添加到我的CustomControl.cs文件中。一切正常,我可以访问我需要的枚举类型。问题从运行时开始,应用程序无法启动,错误为:“找不到类型或命名空间名称“NamespaceHeader”(是否缺少using指令或程序集引用?)。不管怎样,我觉得我们进展得相当顺利
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register("MyProperty", typeof(EnumType), typeof(MyClass), new PropertyMetadata(new PropertyChangedCallback(MyPropertyChangedHandler)));
static void MyPropertyChangedHandler(DependencyObject obj, DependencyPropertyChangedEventArgs args)