“Correct"从其他类设置控件值的方法
本文关键字:控件 设置 方法 其他 Correct quot | 更新日期: 2023-09-27 17:52:48
我想知道正确的方式(最好看)设置,例如,从一个类的标签,而不是我的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
时,感觉真的很糟糕。
你会如何解决这样的问题?
为什么不传递label1
作为参数?
:
class MyClass
{
public void WriteToLabel(Label label)
{
label.Content = "Test";
}
}
你可以使用:
var a = new MyClass();
a.WriteToLabel(label1);
按照惯例,最好尽可能避免代码中的耦合。我不会添加对窗口的引用。
我认为你的做法总体上是好的。但我也会"跟踪"我通过List实例化的子节点,这样我也可以最终使用Linq扩展搜索特定的子节点。我还纠正了代码中的一些小错误(MyClass的父成员的命名约定和WriteToLabel()在父构造函数中被分配给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";
}
}
使用Fluent接口
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;
}
}
问题是为什么您需要从不属于MainWindow
的类中设置Label
的Text
。标签的表单是它的GUI的控制器,类只需要提供你想要在表单中显示的内容。
所以这是更好的练习。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
MyClass a = new MyClass();
string data = a.GetData();
label1.Text = text;
}
}
class MyClass
{
public MyClass()
{
this.parent = parent;
}
public stringGetData()
{
return "Test";
}
}
由于您的类完全了解彼此,因此提供Property accessor是一个好方法。
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";
}
}