无法从用户类访问WPF元素

时间:2014-11-16 16:25:40

标签: c# wpf

下面粘贴的是WPF项目的部分C#代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        public class sc
        {
            string name, content, stopol, client, bkpset;
            public void getndadd()
            {
            }
        }
        sc obj = new sc();

        private void button1_Click(object sender, RoutedEventArgs e)
        {
        }
    }
}

我有几个textBoxes&amp;标签已创建。当点击按钮(button1_Click)时,我想将值存储在类&#34; sc&#34;的对象中。 为此,我写了一个方法getndadd()。但我似乎无法在输入时获取文本框,标签或任何WPF元素。

知道为什么吗?我已经粘贴在我想要的东西之下了。我实际上得到了什么。

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

这是因为不同类别的范围。为了传输文本框,你需要接近你的类sc(getndadd())接受一个参数(例如FrameworkElement)以便将它传递给一个值。

public class sc
{
  string name, content, stopol, client, bkpset;
  public void getndadd(FrameworkElement element)
  {
     var elem = element;
     ...
  }
}

 public MainWindow()
 {
    InitializeComponent();
    sc.getndadd(textBox1);
 }

答案 1 :(得分:1)

您的窗口是MainWindow课程的实例。当您单击按钮1时,button1_Click被调用,这是一个成员函数,因此它可以访问该窗口的所有属性,包括textBox1

您的sc课程(或者更确切地说,它的实例)对您的窗口一无所知。你可以创建一个sc实例而不打开任何窗口,或者你可以有多个窗口......在这种情况下textBox应该sc使用?

一种解决方案是将引用传递给MainWindow实例:

public class sc
{
    // (...)

    public void getndadd(MainWindow window)
    {
        // Here, you can access window.textBox1, and any other public properties
    }
}

或者您可以让button1_Click设置sc个实例的各个字段:

private void button1_Click(object sender, RoutedEventArgs e)
{
    obj.name = textBox1.Text;
    // and so on...
}

然而,WPF附带了一个所谓的“数据绑定”&#39;可以自动化的系统。每个WPF元素都有一个DataContext属性。您可以将元素属性链接到其DataContext中的属性,例如:

<Label Content="{Binding Description}" />

默认情况下,MainWindow的DataContext本身就是MainWindow实例,因此在这种情况下,WPF会检查您的MainWindow类是否包含Description属性。如果是,标签将自动显示该属性的值作为其内容。该系统可以双向工作。

如果将MainWindow的DataContext设置为sc实例,则可以绑定到其属性(请注意,您需要使用属性才能实现此功能,而不是简单字段):

<Label Content="{Binding name}" />
<Label Content="{Binding content}" />
<Label Content="{Binding stopol}" />

等等。如果您希望在代码中更改其中一个属性时自动更新视图,则必须实现INotifyPropertyChanged接口,并在每个属性的setter中引发PropertyChanged事件属性,因此WPF知道何时更改属性(以及属性)。

最后一点:您的一些名字非常不具备说明性 - 我无法说明scgetndadd代表什么或他们应该做什么。此外,C#中的类和方法名称是按照惯例使用CamelCased。