如何在 Windows 自定义控件中设置动态属性

本文关键字:设置 动态 属性 自定义控件 Windows | 更新日期: 2023-09-27 18:27:57

我创建了一个用户控件,它有两个属性

  1. 类型
  2. 参数

其中Type是枚举,

public enum Type { XType , YType }

Parameter属于String类型

现在,我需要将Parameter更改为枚举。我敢肯定每个Type都会有两个参数.

哪些是XTypeFoo, XTypeBar, YTypeFoo, YTypeBar.

在此之前,我将Parameter保留为String财产。现在我为此创建了两个枚举,

public enum XParameter { XTypeFoo, XTypeBar } and
public enum YParameter { YTypeFoo, YTypeBar }

现在我需要将 Parameter 属性的类型从 string 更改为其他类型(取决于Type(

即,如果用户选择Type作为XType,那么Parameter应该是XParameter,如果是YTypeXParameter

那么什么是基本类型。

如何在 Windows 自定义控件中设置动态属性

不可能,我认为不需要。你应该重新设计你的类。

拥有一个只有{ Foo, Bar }参数的枚举怎么样?

你不能从enums固有,所以你需要使用类。要么对每个枚举值使用类常量,要么使用"Dummyclass":

在这两种情况下,您都使用基类:

public class BaseParameter { }

"假人类":

public class XParameter : BaseParameter { }
public class YParameter : BaseParameter { }
public class XTypeFoo : XParameter { }
public class XTypebar : XParameter { }
public class YTypeFoo : YParameter { }
public class YTypebar : YParameter { }

常数:

public class XParameter : BaseParameter
{
    public readonly BaseParameter TypeFoo = new XParameter();
    public readonly BaseParameter TypeBar = new XParameter();
}
public class YParameter : BaseParameter
{
    public readonly BaseParameter TypeFoo = new YParameter();
    public readonly BaseParameter TypeBar = new YParameter();
}

在这两种情况下,您都可以使用IsAssignable来检查XParameterYParamter以及您使用的确切value is XTypeFoovalue == XParameter.TypeFoo

如果Type将是一个枚举,并且Parameter也将是一个枚举(尽管允许的值将取决于Type(,那么基本上,所有可能的值都是事先知道的。那么,为什么不对Parameter和丢弃Type属性进行单个组合枚举呢?例如

public enum ParameterType
{
  XTypeFoo,
  XTypeBar,
  YTypeFoo,
  YTypeBar,
}

或者,您可以开始向Parameter询问类型信息。例如

public interface IParameter
{
   public ParamType GetParamType();
}
public sealed class FooParameter : IParameter
{
  public static readonly FooParameter XParameter = new FooParameter();
  public static readonly FooParameter YParameter = new FooParameter();
  public ParamType GetParamType() { return ParamType.Foo; }
  private FooParameter() { }
}
public sealed class BarParameter : IParameter
{
  public static readonly BarParameter XParameter = new BarParameter();
  public static readonly BarParameter YParameter = new BarParameter();
  public ParamType GetParamType() { return ParamType.Bar; }
  private BarParameter() { }
}
public class MyControl : UserControl
{
   IParameter Parameter {get; set; }
   ...
}