将对象传递给UITypeEditor

时间:2009-06-18 03:18:11

标签: c# propertygrid uitypeeditor

我目前希望使用PropertyGrid来允许用户编辑我的一些类,但是我已经碰到了将对象传递给他们使用的UITypeEditor的墙。当用户按下下拉列表时,我想显示已加载纹理的列表框以供选择,如果他们想要使用应用程序尚未加载的纹理,他们可以单击按钮从文件对话框中选择一个。如果我在这里没有任何意义的形式的模拟:

Dropdown Image

我的问题:要填充列表框,我需要访问管理UITypeEditor资源列表的类。

现在我已经为自己的类解决了这个问题,给他们一个关于创建它们的管理对象的参考。在UITypeEditor中,我然后使用该引用来访问我需要的内容。但是,对于我没有编写过的类,我不能这样做,比如XNA Texture2D类。

以下是我正在使用的课程:

class StaticGeometryChunk
{
    // Geometry data to draw with. Contains a reference to its managing 
    // class for use in its UITypeEditor.
    public GeometryData { get; set; }
    ....
}

class Material
{
    // These are XNA classes. I can't just add a reference to its managing 
    // class (I think?).
    public Texture2D Texture1 { get; set; }
    public Texture2D Texture2 { get; set; }
    ....
}

我一直在看我的选择,他们似乎是:

  1. 使管理类保持静态。
  2. 我真的不想这样做。有几个管理类,因为每个资源的加载方式不同。还有一些类需要在这些类之前创建并传入。

    1. 管理班级单身人士。
    2. 我也不想这样做。这似乎是一种快速而肮脏的方式来“隐藏”问题而不是“解决”它。我也可能希望将来可以选择几个管理课程,单身人士会消除这些课程。

      1. 创建一个包装类,该类包含对管理类及其目标(例如XNA Texture2D)的引用。
      2. 这是我正在考虑的事情。它会非常简单快捷,但有些事情让我感到困惑,但我不知道是什么。

        有关将上述内容或其他方法传递给UITypeEditor的任何想法吗?

        感谢您的阅读。

2 个答案:

答案 0 :(得分:9)

在EditValue方法中,您将获得一个上下文。使用context.Instance访问保存属性的对象。此对象还应包含一个属性,使您可以访问要显示的事物列表。您可以测试context.Instance是否为ITextureProvider,然后将其转换并访问纹理。不确定这在你的设计中是否有意义,但请告诉我。

答案 1 :(得分:4)

作为替代方案,您可以尝试以下方法。我发现它非常优雅,因为它不需要在对象中存储可用属性值的列表。因此,例如,您可以在一个表单上显示一组值,在另一个表单上显示另一组值。

  1. 创建一个接口IYourDataProviderService。
  2. 创建IYourDataProviderService的实现,它知道要提供的具体数据。
  3. 创建一个实现ISite的类。在GetService()方法中,如果serviceType参数是typeof(IYourDataProviderService),则返回实现IYourDataProviderService的类的实例。 我留下了其余的ISite方法抛出NotImplementedException(除了DesignMode属性),对我来说它有用,但可能这不是一个理想的解决方案。
  4. 在“加载”事件处理程序中将您的实现分配给propertygrid的Site属性。
  5. 享受!