请说,我需要知道我错过了什么,或者我在使用以下代码做错了什么?
public class Program
{
public static void Main()
{
var a = new A();
a.Controls.Add(new B());
a.Controls.Add(new C());
a.Controls.Add(new D());
a.DisplayMode = DisplayMode.Edit;
}
}
public enum DisplayMode
{
View = 0,
Edit = 1
}
public interface IMode
{
DisplayMode DisplayMode { get; set; }
}
public class A
{
private DisplayMode mDisplayMode;
public A()
{
mDisplayMode = DisplayMode.View;
Controls = new List<object>();
}
public DisplayMode DisplayMode
{
get
{
return mDisplayMode;
}
set
{
if (mDisplayMode != value)
{
mDisplayMode = value;
foreach (var control in Controls)
if (control is IMode)
(control as IMode).DisplayMode = value;
// the control ( b ).DisplayMode is not firing or executing the set
// what i am missing here?
}
}
}
public List<object> Controls { get; set; }
}
public class B : IMode
{
private DisplayMode mDisplayMode;
public B()
{
X=0;
mDisplayMode=DisplayMode.View;
}
public int X { get ; set;}
public DisplayMode DisplayMode
{
get
{
return mDisplayMode;
}
set
{
if (mDisplayMode != value)
{
mDisplayMode = value;
// some code should be executed;
X=10;
}
}
}
}
public class C {}
public class D {}
在我调用a.DisplayMode=DisplayMode.Edit
之后我期待所有控件(B)都将执行DisplayMode集,但在执行代码之后,它根本不会触发
我的意思是DisplayMode setter值没有执行,因为如果是这样那么X值应该变成10
答案 0 :(得分:1)
似乎您应该捕获B
的实例以进行验证,但使用您的确切代码,这对我有用:
编辑:来自OP的示例的更新代码,其中B
具有在X
更改时设置的属性DisplayMode
:
var a = new A();
var b = new B();
Console.WriteLine("Starting value of b Properties:");
Console.WriteLine(" - b.DisplayMode ... {0}", b.DisplayMode);
Console.WriteLine(" - b.X ............. {0}", b.X);
a.Controls.Add(b);
a.DisplayMode = DisplayMode.Edit;
Console.WriteLine("Ending value of b Properties:");
Console.WriteLine(" - b.DisplayMode ... {0}", b.DisplayMode);
Console.WriteLine(" - b.X ............. {0}", b.X);
// Ouput:
// Starting value of b Properties:
// - b.DisplayMode ... View
// - b.X ............. 0
// Ending value of b Properties:
// - b.DisplayMode ... Edit
// - b.X ............. 10
答案 1 :(得分:0)
1 /首先应该实例化列表。
2 /你确定mDisplayMode!=值? 我的意思是当你在A上设置显示模式为“编辑”时,也许它已经是它的价值了。
答案 2 :(得分:0)
正如他们所说,你的代码应该没有任何问题
你可以发布原始代码,也许你遗漏了改变代码行为的东西吗?
如果您坚持不调用setter,则尝试使用反射调用它,例如
而不是(control as IMode).DisplayMode
,您可以执行以下操作
var type=control.GetType();
var property=type.GetProperty("DisplayMode");
property.SetValue(control,value,null);
希望这会对你有所帮助