我想知道正确的方法(最好看的)设置,例如,来自我MainWindow
以外的类的标签。
目前,我会做这样的事情:
public partial class MainWindow: Window {
public MainWindow() {
InitializeComponent();
MyClass a=new MyClass(this);
a.WriteToLabel();
}
}
class MyClass {
MainWindow parent;
public MyClass(MainWindow parent) {
this.parent=parent;
}
public void WriteToLabel() {
parent.label1.Text="Test";
}
}
但我觉得这是一种不好的做法。
当你有超过20个类并且所有字段或属性都为parent
时,感觉非常糟糕。
你会如何解决这样的问题?
答案 0 :(得分:3)
为什么不将label1
作为参数传递?
使用:
class MyClass
{
public void WriteToLabel(Label label)
{
label.Content = "Test";
}
}
你会使用:
var a = new MyClass();
a.WriteToLabel(label1);
通常最好避免尽可能地在代码中进行耦合。我不会添加对窗口的引用。我宁愿尽可能地参数化我的方法。
答案 1 :(得分:2)
我认为你的练习总体上是好的。但我也会“跟踪”我通过List实现的孩子,所以我最终也可以使用Linq扩展来搜索特定的孩子。 我还纠正了代码中的一些小错误(MyClass的父成员的命名约定和WriteToLabel()的void结果被分配给父构造函数中的MyClass实例。
public partial class MainWindow : Window
{
private List<MyClass> children;
public MainWindow()
{
children = new List<MyClass>();
InitializeComponent();
MyClass child = InstantiateChild();
child.WriteToLabel();
}
private MyClass InstantiateChild()
{
MyClass child = new MyClass(this);
children.Add(child);
return child;
}
}
public class MyClass
{
private MainWindow m_Parent;
public MyClass(MainWindow parent)
{
m_Parent = parent;
}
public void WriteToLabel()
{
m_Parent.label1.Text = "Test";
}
}
答案 2 :(得分:0)
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
MyClass a = new MyClass(this).WriteToLabel("Test");
}
}
class MyClass
{
MainWindow parent;
public MyClass(MainWindow parent)
{
this.parent = parent;
}
public MyClass WriteToLabel(string txt)
{
parent.label1.Text = txt;
return this;
}
}
答案 3 :(得分:0)
问题是您需要从不属于Label
的班级设置Text
的{{1}}。标签的形式是它的GUI的控制器,类只需要提供你想要在表单中显示的内容。
所以这是更好的练习。
MainWindow
答案 4 :(得分:0)
由于您的班级彼此完全了解,一个好方法是提供属性访问者。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
MyClass a = new MyClass(this);
a.WriteToLabel();
}
public string LabelText
{
get { return label1.Text; }
set {
if (this.InvokeRequired)
{
this.BeginInvoke(
delegate() =>
{
label1.Text =value;
})};
}
else
{
label1.Text = value;
}
}
}
class MyClass
{
MainWindow parent;
public MyClass(MainWindow parent)
{
this.parent = parent;
}
public void WriteToLabel()
{
parent.LabelText = "Test";
}
}