Properties 编辑的属性谁可以';t不能同样地设置为真/假

Properties 编辑的属性谁可以';t不能同样地设置为真/假,properties,Properties,很难解释我的问题,所以如果不太清楚,请让我休息一下 我有大约十个属性可以在视图中编辑。他们大多数是布尔人。这些属性配置测试环境(就像可以配置一个属性来显示解决方案) 现在的问题是,如果其他属性设置为false,则某些属性无法设置为true。没有什么会出错,但它只是无用的。就像一个属性配置为不显示正确的按钮,另一个属性配置为显示解决方案。在我们的系统中,如果您不能点击正确的按钮,那么解决方案将永远不会显示 这种问题有名字吗? 这些属性是否有名称(就像存在不可变属性一样)? 是否有实现这样一个故事的

很难解释我的问题,所以如果不太清楚,请让我休息一下

我有大约十个属性可以在视图中编辑。他们大多数是布尔人。这些属性配置测试环境(就像可以配置一个属性来显示解决方案)

现在的问题是,如果其他属性设置为false,则某些属性无法设置为true。没有什么会出错,但它只是无用的。就像一个属性配置为不显示正确的按钮,另一个属性配置为显示解决方案。在我们的系统中,如果您不能点击正确的按钮,那么解决方案将永远不会显示

这种问题有名字吗? 这些属性是否有名称(就像存在不可变属性一样)?
是否有实现这样一个故事的最佳实践?我们可以在视图中对其进行硬编码,但我更希望使用通用系统。

您可以使用int或long来存储相关属性,并在设置属性时使用位掩码来正确清除无效设置。此int或long可以是标记枚举的形式

[Flags]private enum BitValues
{
  Bit1 = 1 << 0, //Inclusive
  Bit2 = 1 << 1, //Exclusive to bit 3 and 4
  Bit3 = 1 << 2, //Exclusive to bit 2 and 4
  Bit4 = 1 << 3, //Exclusive to bit 2 and 3
  ExclusiveBits = Bit2 | Bit3 | Bit4 //All exclusive bits
}

private BitValues enValues;

public bool Bit1
{
  get { return (enValues & BitValues.Bit1) == BitValues.Bit1; }
  set
  {
    //Clear the bit
    enValues = (enValues ^ BitValues.Bit1) & enValues;

    //Set the bit
    enValues = enValues | BitValues.Bit1;
  }
}

public bool Bit2
{
  get { return (enValues & BitValues.Bit2) == BitValues.Bit2; }
  set
  {
    //Clear exclusive bits
    enValues = (enValues ^ BitValues.ExclusiveBits) & enValues;

    //Set bit
    enValues = enValues | BitValues.Bit2;
  }
}
[Flags]私有枚举位值
{

Bit1=1您很可能对解决方案进行了错误建模

试着用另一种方式思考——也许你可以消除一些可以从其他参数中推断出来的参数,或者你可以使用枚举将几个参数组合成一个参数


调查参数的值空间以找到它。

您要查找的词是正交性。设置不是正交的,因为它们不能独立变化

至于如何处理显示这些属性,完全通用的方法(您的问题可能不会保证这种通用性的编码成本)是为每个控件提供一个引用其他控件的表达式,如果完整表达式的计算结果为true(或false),则在视图中禁用该控件

更容易编码的是一个控件,它公开了一个
isDisabled()
方法,您可以根据需要重写该方法。下面是一个简短的Java示例,它利用Java匿名类来完成繁重的工作。它假设已经有一个
控件
类,带有
booleanValue()
getter,它将其转换为布尔值,并且由于
AutoDisabledControl
是一个控件,因此可以将其用作控件的插入式替换:

  public class AutoDisabledControl extends Control {
    public isDisabled() { return false ; }
  }

  ..... usage ....
  // control1 is never disabled
  final Control1 = new AutoDisabledControl() ;
  // Control2 is disabled if control1 is false
  final Control2 = new  AutoDisabledControl() {
    public isDisabled() { return control1.booleanValue() == false; }
  };
  // conntrol 3 is enabled only if control1 and control2 are true
  final Control1 = new  AutoDisabledControl() {
    public isDisabled() { return ! (
                        control1.booleanValue()
                        && control2.booleanValue()) ; 
  };

当然,在视图的显示中,它会检查每个控件的
isDisabled()
,并禁用返回true的值;当控件的值更改时,视图将重新显示。我假设某种MVC模式。

这是什么语言/技术?确实,我也朝着这个方向思考。但这并不是那么简单。如果a为true,那么B可能为true和false。如果a为false,那么B只能为true和false为假。如果A设置为真,B设置为真,当A更改为假时,您是否会自动更改B?或者您是否显示错误,表示B为真时A不能为假…”“如果A为真,则B可能为真和假。如果A为假,则B只能为假。”在这种情况下,当A为真时,在缩进的A下显示B,当A为假时,隐藏B或将其显示为灰色。非常有趣。当然,用户很难知道他必须更改哪个控件才能再次启用另一个控件…好吧,您可以将其作为静态文本添加到视图中…或者您可以更改自动禁用dControl以公开其被禁用的文本原因。