我有一个复杂的 WPF 控件,由于某些原因(例如性能),它没有使用依赖属性,而是简单的 C# 属性(至少在顶层这些被公开为属性)。
目标是使绑定到其中一些顶层属性成为可能 -> 我猜我应该将它们声明为 DPs。(对吗?还是有其他方法可以实现此目标?)
我开始阅读 MSDN 上关于 DependencyProperties 和 DependencyObjects 的内容,并找到了一个示例:
public class MyStateControl : ButtonBase
{
public MyStateControl() : base() { }
public Boolean State
{
get { return (Boolean)this.GetValue(StateProperty); }
set { this.SetValue(StateProperty, value); }
}
public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
"State", typeof(Boolean), typeof(MyStateControl),new PropertyMetadata(false));
}
如果我理解正确-这段代码强制属性由DependencyProperty支持,这将限制它成为一个简单的属性,并且只有一个存储器(从功能角度而言,不是技术上),而不能在getter每次被调用时计算属性值并设置其他属性/字段每次setter被调用。
那我该怎么办呢?是否有任何方法可以让这两个世界在某个点相遇?
//编辑 我想我需要告诉你更多关于我想做什么和我的限制。所以:
我有一个TabControl,它绑定到ViewModel(我使用MVVM模式)对象的集合。每个选项卡都意味着是该集合中一个对象的编辑器。对象可以是不同类型的,因此我有多个定义,每个定义都有不同的DataType属性。现在我有一个复杂的WPF控件,我想将其用作其中一个DataTemplates的一部分。如果我使用普通的TextBox,我可以简单地绑定到它的Text属性,但是我无法对该自定义控件的Text属性执行相同的操作,因为它的Text属性不是依赖属性。 在这种情况下,我有:
没有直接访问控件本身或其事件 没有可以用来做这种事情的代码后台文件
然而,我可以看到一个肮脏的解决方案-
在Window类中,我将需要订阅绑定到TabControl的集合的CollectionChanged事件。 每当向该集合添加一个项目时,使用ItemContainerGenerator获取I suppose TabItem的副本,并使用它找到正确的'complex control'的副本 注册items处理程序以执行任务
这是错误的,因为:
这是反对MVVM的-我必须使用选项卡控件来完成工作,而不是在ViewModel类中完成工作 这种方式会以不想要的方式耦合视图和视图模型