“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时,感觉真的很糟糕。
你会如何解决这样的问题?

“Correct"从其他类设置控件值的方法

为什么不传递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的类中设置LabelText。标签的表单是它的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";
    } 
}