2

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

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

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

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


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

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

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

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

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

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

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

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

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

4

1 回答 1

0

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

对于第二种解决方案,您只需要使用PropertyChangedCallback注册依赖属性:

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

static void MyPropertyChangedHandler(DependencyObject obj, DependencyPropertyChangedEventArgs args)

检查此线程的使用情况FrameworkPropertyMetadataUIPropertyMetadata以及PropertyMetadata 何时应在普通 PropertyMetadata 上使用 FrameworkPropertyMetadata 或 UIPropertyMetadata?

您的第一个解决方案的优点是它很轻,您只需要 2 ValueConvertors,不需要依赖属性,因此另一个开发人员只需查看您的xaml. 缺点是如果您计划在多个地方使用具有相同逻辑的自定义控件,则复制粘贴这些转换器不是很整洁。

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

于 2012-06-19T23:21:13.403 回答