【问题标题】:Binding a CustomControl DependencyProperty to a ViewModel enum将 CustomControl DependencyProperty 绑定到 ViewModel 枚举
【发布时间】:2012-06-19 22:44:52
【问题描述】:

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

我希望枚举绑定能够更改控件中的一些内容,其中包括:

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

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


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

我已经想到了两种可能的方法:

  1. 公开有用的 DP 类型并将这些属性绑定到同一个枚举(例如 Property1="{Binding someEnum}" Property2="{Binding someEnum}"),还提供一个 ValueConvertor 将这些枚举转换为 CustomControl 可以使用的有用类型然后使用,
  2. 或者,公开一个接受枚举的 DP,然后根据绑定枚举的值更改 CustomControl 代码中其他位置的属性?

我对使用 Views 代码隐藏文件中的值转换器执行选项 1 相当满意。但是,我想避免这样做,因为它会使控件的独立性降低。

关于选项二,我不完全确定如何以这种方式进行操作,因此如果您认为这是可行的方法,文章或小解释会有所帮助 - 可能在 DP 上实现 INoitifyPropertyChanged,以便控件知道它的价值Bound 枚举改变时改变了吗?

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

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

快速说明:我想避免更改 ViewModel - 除非绝对必要,否则公开的枚举和那里的所有逻辑都应该保持原样!

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

【问题讨论】:

    标签: c# wpf mvvm enums custom-controls


    【解决方案1】:

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

    对于第二种解决方案,您只需使用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。 缺点是如果您打算在多个地方使用具有相同逻辑的自定义控件,则复制粘贴这些转换器不是很整洁。

    第二种解决方案是第一种解决方案的镜像,您具有更高水平的可重用性优势,但您的逻辑会深深嵌入您的控制中。

    【讨论】:

    • 非常感谢您的快速回复。只有一个问题,使用您建议的方法,我是否必须在 CustomControls 代码中的 ViewModel 中创建一个重复的枚举列表,以便它们都包含相同的元素?
    • 不,您会将新的依赖属性绑定到您的 ViewModel。绑定是一种在目标和源之间创建连接的方法,因此您不必复制任何内容。
    • 问题是,我不知道创建 DependencyProperty 时要分配什么类型,因为 VM 中的枚举类型在我的 CustomControl 中不可用。 DependencyProperty.Register("MyProperty", typeof(EnumType), typeof(MyClass), new PropertyMetadata(new PropertyChangedCallback(MyPropertyChangedHandler))); - 这里应该用什么替换“EnumType”?对不起,我的困惑!
    • 应该是你的枚举类型;为什么它在您的 CustomControl 中不可用?如果您的自定义控件无法使用它,那么您可能应该坚持解决方案。 1 个转换器。
    • 我不确定为什么我不能访问我创建的枚举类型,我对编程还很陌生!无论如何,我添加了对 ViewModelLibrary 的引用,其中包含我需要的枚举类型,并将相应的 using 添加到我的 CustomControl.cs 文件中。一切正常,我可以访问我需要的枚举类型。问题从运行时开始,应用程序无法以错误启动:“找不到类型或命名空间名称‘NamespaceHeader’(您是否缺少 using 指令或程序集引用?)”。无论如何,我觉得我们现在离题太远了,所以我可能不得不离开这个!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2012-09-17
    • 2011-12-21
    • 2015-10-17
    相关资源
    最近更新 更多