C# 将CustomControl DependencyProperty绑定到ViewModel枚举

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,它将具有受ViewModel中的枚举影响的各种属性。创建的CustomControl将在视图中调用

我希望enum绑定可以更改控件中的一些内容,包括:

  • 更改图像源(更改为的图像在CustomControl库中创建的文件夹中是静态的)
  • 更改TextBlocks Text属性,同样,文本选项将在X个案例中的一个案例之间保持静态(X是可能的枚举状态数(也不会更改))
请记住,这两个DP将被链接,例如,如果绑定枚举为案例x,则图像源将改变显示的文本。 基本上,此处的两个公开DP将绑定到相同的枚举,但使用方式不同


因此,我的问题是,携带上述物品的最佳方式是什么

我已经考虑过两种可能的方法:

  • 公开有用的DP类型并将这些属性绑定到相同的枚举(例如Property1=“{Binding someEnum}”Property2=“{Binding someEnum}”),还提供一个ValueConverter将这些枚举转换为CustomControl可以使用的有用类型
  • 或者,公开一个DP,该DP接受一个枚举,然后根据绑定枚举的值在CustomControl代码中的其他地方更改属性
  • 我对在视图代码隐藏文件中使用值转换器执行选项1相当满意。但是,我希望避免这样做,因为这样会使控制不那么独立

    关于选项二,我不完全确定如何这样做,因此如果您认为这是一种方法,那么文章或一个小的解释会有所帮助-可能在DP上实现INoitifyPropertyChanged,以便控件知道绑定枚举更改时它的值已更改

    此外,我不限于做这两种方式描述,如果你觉得有更好的方式,请建议它

    我将WPF(C#)与MVVM体系结构(MVVM Light Toolkit)结合使用

    快速提示:我希望避免更改ViewModel-除非绝对必要,否则公开的枚举和所有逻辑都应该保持原样


    提前感谢您的回复,我将尽可能多地更新此问题,并提供有关问题个人进展的回复和更新,以及可能需要的额外信息

    您的两种解决方案都应该可以正常工作

    对于第二种解决方案,您只需将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)