从 C# WPF 中的另一个类访问控件的属性

rem*_*rem 5 c# wpf controls properties class

我在类之间的可见性方面一团糟。请帮我解决这个新手问题。

我有两个控件(来自默认 WPF 工具箱的 DatePickers),它们在不同的窗口中,所以在不同的类中。我可以轻松地访问这些控件属性,例如datePicker1.Text从其本机类中,即在其本机窗口中,但是当我尝试datePicker1.Text从另一个窗口访问时,我什么也得不到。

我尝试将一个 datePicker 的值分配给另一个,在我的代码中使用对窗口的引用:

string testStr;
...
AnotherWindow aw = new AnotherWindow();
testStr = aw.datePicker2.Text;
datePicker1.Text = testStr;
Run Code Online (Sandbox Code Playgroud)

它不起作用

我也尝试通过类的公共属性来做到这一点,例如:

public partial class AnotherWindow : Window
{
....

public string dateNearest
    {

        get { return datePicker2.Text; }
        set { datePicker2.Text = value; }
    }
....
Run Code Online (Sandbox Code Playgroud)

然后在另一个窗口中使用它:

string testStr;
...      
AnotherWindow aw = new AnotherWindow();
testStr = aw.dateNearest;
Run Code Online (Sandbox Code Playgroud)

但也没有赋值。

请帮助我理解这个基本问题。我知道还有其他方法可以访问 WPF 中的值,例如数据绑定,但我想先了解基础知识。

Bil*_*llW 1

我现在正在使用 VS 2010 beta 2,它在执行最简单的 WPF 编码时经常崩溃,例如尝试复制您问题的代码:):但请考虑:

使用这种语法是否有可能“做正确的事”:

    public string dateNearest 
    { 
        get { return this.datePicker2.Text; } 
        set { this.datePicker2.Text = value; } 
    }
Run Code Online (Sandbox Code Playgroud)

编辑 1:好的,我得到了您的代码的 WPF 复制,它没有崩溃:使用上述语法,我可以在“其他窗口”中获取和设置属性。

编辑2:该代码也可以使用您的原始代码:) 在我第一次阅读它时,我觉得它是“正确的”。您是否在阅读之前设置该属性?:据我所知,DateTimePicker 的 Text 属性在首次创建时默认为空字符串。

编辑3:响应雷姆的请求:

  1. 主窗口有一个按钮“button1”:它测试设置和获取在名为“WindowAdded”的第二个窗口的实例中定义的公共属性 DTContent:这是主窗口代码中该按钮的“Click 事件处理程序”:

    private void button1_Click(object sender, RoutedEventArgs e)
    {
      WindowAdded wa = new WindowAdded();    
      wa.DTContent = DateTime.Now.ToString();
      Console.WriteLine("dt = " + wa.DTContent);
    }
    
    Run Code Online (Sandbox Code Playgroud)

编辑4:一个更好的“现实世界”示例:大多数情况下,您会想要创建另一个窗口的实例,并保留它,以供重复使用:恕我直言:不让它只存在于按钮的范围内点击事件。所以请考虑一下:

在主窗口代码范围内的某个位置为您将添加的窗口定义一个“占位符”: private WindowAdded wa;

如果您选择最适合创建该窗口的实例:创建实例,并分配给您的“占位符”变量:然后根据需要重新使用它。在 WinForms 中,我最常创建所需的辅助窗口,我需要重新使用对实例的引用,以在主窗体的加载或显示事件中访问它们上的某些内容。

讨论:当然,如果您的目的是创建“临时”窗口,并且不需要再次重新使用对新窗口实例的引用,那么在某个函数的范围内创建它就可以了。

而且,如果您在第二个窗口上唯一需要访问的是 DateTimePicker,那么您可以使用上面建议的相同技术,但仅创建并保留对 DateTimePicker 实例的引用。