2012-02-20 69 views

回答

3

最简单的方法是在WPF中使用Attached Property

附加属性允许您创建任何属性并将其与元素相关联。然后,您可以使用它来存储数据并参与绑定方案。

public class MyCustomIdSource 
{ 
    public static readonly DependencyProperty MyCustomIdProperty = 
     DependencyProperty.RegisterAttached("MyCustomId", typeof(Int32), typeof(MyCustomIdSource)); 

    public static void SetMyCustomId(UIElement element, Int32 value) 
    { 
     element.SetValue(MyCustomIdProperty, value); 
    } 

    public static Int32 GetMyCustomId(UIElement element) 
    { 
     return (Int32)element.GetValue(MyCustomIdProperty); 
    } 
} 

但是,您可能希望通过将自定义数据放入WPF元素本身来考虑您正在实现的目标。你真的想让这个元素负责吗?把这个责任分解成一个维护观点的逻辑和状态的类,然后把观点与它联系起来会更有意义吗?这被称为Model-View-ViewModel模式,非常适合WPF开发。

+0

对于所有关于附加属性的说法,您都说得对,我还建议使用它们,因为类型安全。但是如果你正在认真寻找在FrameworkElement上存储更多信息的最简单的方法,那么它就是'Tag'属性。 – Clemens 2012-02-20 18:54:47

+0

@Clemens - 你知道,你是对的,那将是最简单的开始(我甚至不知道还有'Tag'属性),但是持续维护该财产中的数据压倒任何“简单”的概念。我记得VB *不寒而栗时,使用那个看似简单的属性是多么快速和多么痛苦的崩溃。 – codekaizen 2012-02-20 19:11:15

+0

谢谢:)这看起来像我脑子里想的那样。它可能太复杂,不值得?我可能需要解释一点...我在代码中动态创建对象。当它们中的一个与之交互时,我会想知道它是否具有“parentid”或其他小的属性,如“id”,“datasize”,“url”等。将它们放在Name/Tag中似乎更简单,除非我错过了什么?例如:object.Name =“9_2_24”。 ....否则,每次都必须从原始来源(即数据库)请求。如果“myObject.parentid”会是理想的,但... – Ael 2012-02-20 19:15:49

相关问题