将CustomControl DependencyProperty绑定到ViewModel枚举

时间:2012-06-19 22:44:52

标签: c# wpf mvvm enums custom-controls

我正在尝试创建一个CustomControl,它将具有受ViewModel中的枚举影响的各种属性。创建的CustomControl将在View中调用。

我希望枚举绑定能够改变Control中的一些内容,包括:

  • 更改图像源(图像更改为在CustomControl库中创建的文件夹中是静态的),
  • 再次改变TextBlocks Text属性,文本选项在X个案例之一之间将是静态的(X是可能的枚举状态数(也不会改变))。

请记住,这两个DP将被链接,例如如果绑定枚举是大小写x,则图像源将更改显示的文本。 基本上,这里暴露的两个DP将绑定到相同的枚举,但使用方式不同。


那么,我的问题是什么,最好的方式来进行上述描述?

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

  1. 公开有用的DP类型并将这些属性绑定到同一枚举(例如Property1 =“{Binding someEnum}”Property2 =“{Binding someEnum}”)并提供ValueConvertor将这些枚举转换为CustomControl可以使用的有用类型然后使用,
  2. 或者,公开一个接受枚举的DP,然后在CustomControl代码中的其他位置更改属性,具体取决于绑定枚举的值?
  3. 我很满意在Views代码隐藏文件中使用值转换器执行选项1。但是,我想避免这样做,因为它会使控件不那么独立。

    关于选项二,我不完全确定如何这样做,所以文章或一个小解释将有所帮助,如果你觉得这是要走的路 - 可能在DP上实现INoitifyPropertyChanged所以控件知道它的价值已经Bound enum更改后是否已更改?

    另外,我不仅限于所描述的两种方式,如果您觉得有更好的方法,请提出建议!

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

    快速注意:我想避免改变ViewModel - 暴露的枚举和所有逻辑都应该保留,除非绝对必要!

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

1 个答案:

答案 0 :(得分:0)

你的两个解决方案都应该可以正常工作。

对于第二个解决方案,您需要的只是使用PropertyChangedCallback注册dependecy属性:

public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.Register("MyProperty", typeof(EnumType), typeof(MyClass), new PropertyMetadata(new PropertyChangedCallback(MyPropertyChangedHandler)));

static void MyPropertyChangedHandler(DependencyObject obj, DependencyPropertyChangedEventArgs args)

检查此帖子是否使用了FrameworkPropertyMetadataUIPropertyMetadataPropertyMetadata When should I use FrameworkPropertyMetadata or UIPropertyMetadata over plain PropertyMetadata?

您的第一个解决方案的优点是它很轻,您只需要2 ValueConvertors,不需要依赖属性,这样另一个开发人员可以理解枚举和这些属性之间存在紧密依赖关系只看你的xaml。 缺点是,如果您计划在多个位置使用具有相同逻辑的自定义控件,则复制粘贴这些转换器并不是很整洁。

第二个解决方案是第一个解决方案的镜像,您可以获得更高级别的可重用性,但是您的逻辑深深嵌入您的控制中。