试图重构一个繁琐的解决方案 ,我来动态地创建附加属性,基本的高招 :
void SomeMethod()
{
...
var dp = DependencyProperty.RegisterAttached("SomeUniqueOrGeneratedName333", typeof(object), typeof(CurrentClass));
...
}
这是不推荐的方式。
我使用这样的性质(大的惊喜,就像如果有人使用附加别的东西属性)作为存储一些对象数据(即绑定)有关。 它们可以使用同样的方法的拉姆达(不知道怎么叫, 封我能想到的最接近的词),如日后提取:
// create attached property an store binding to retrieve result later
var dp = DependencyProperty.RegisterAttached("LolBinding", typeof(object), typeof(CurrentClass));
BindingOperations.SetBinding(obj, dp, someBinding);
// another ap and binding, this time with event (will trigger when DataContext for obj is set)
BindingOperations.SetBinding(obj, DependencyProperty.RegisterAttached("LolAnotherBinding", typeof(object), typeof(CurrentClass), new PropertyMetadata(null, (d, e) =>
{
var value = obj.GetValue(dp); // accessing ap
if (value != null) { ... } // do something
})), Property);
这工作。 因为我喜欢我可以将任意数量的属性:
for(int i = 0; i < 10000; i++)
DependencyProperty.RegisterAttached("SomeName" + i, typeof(object), typeof(MainWindow));
但它也有问题,因为它无法检索依赖属性 (也通过反射 )。 我的猜测( 随时发现 ),这是因为这些都不是类型的静态成员 。
这里是我的问题:这是好一些呢?
我关注的是内存(即泄漏)和性能。 我可以开始使用这项技术很多,如果它被证实是好的。
五月听起来像是根据意见,但我怀疑是能单独正常进行测试。
编辑,这里是MCVE创建和检索的财产:
// put this into window constructor
var dp = DependencyProperty.RegisterAttached("SomeName", typeof(object), typeof(MainWindow));
SetValue(dp, "test"); // even trying to set value
// trying to access it by name
var a = DependencyPropertyDescriptor.FromName("SomeName", typeof(MainWindow), typeof(MainWindow), true);
var b = GetAttachedProperty(this, "SomeName", typeof(MainWindow)); // method from linked question
无论a
和b
是null
。 我只能访问dp
周围路过的参考。
PS:在尝试创建具有相同的名称将引发依赖属性。 所以应该有一种方法来访问它。