从其他类设置控制值的“正确”方法

时间:2013-01-12 21:46:32

标签: c#

我想知道正确的方法(最好看的)设置,例如,来自我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时,感觉非常糟糕。
你会如何解决这样的问题?

5 个答案:

答案 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)

使用Fluent interface

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";
    } 
}
相关问题