我在课堂之间的可见性很混乱。请帮我解决这个新手问题。
我有两个控件(来自默认WPF工具箱的DatePickers),它们位于不同的窗口中,所以在不同的类中。我可以从其本机类中轻松访问这些控件属性,如datePicker1.Text
,即在其原生窗口中,但当我尝试从另一个窗口到达datePicker1.Text
时,我什么也得不到。
我尝试使用对代码中窗口的引用将一个datePicker的值赋给另一个:
string testStr;
...
AnotherWindow aw = new AnotherWindow();
testStr = aw.datePicker2.Text;
datePicker1.Text = testStr;
它不起作用
我也尝试通过类的公共属性来完成它,例如:
public partial class AnotherWindow : Window
{
....
public string dateNearest
{
get { return datePicker2.Text; }
set { datePicker2.Text = value; }
}
....
然后在另一个窗口中使用它:
string testStr;
...
AnotherWindow aw = new AnotherWindow();
testStr = aw.dateNearest;
但也没有赋值。
请帮助我理解这个基本问题。我知道在数据绑定中有其他方法可以访问WPF中的值,但我想首先了解基础知识。
答案 0 :(得分:2)
不幸的是,WPF的基础是数据绑定。以任何其他方式做这件事是“反对谷物”,这是一种不好的做法,而且编码和理解通常要复杂得多。
对于您手头的问题,如果您要在视图之间共享数据(即使它只是一个视图),请创建一个包含属性的视图模型类表示数据,并从视图中绑定到属性。
在您的代码中,只管理您的视图模型类,并且不要使用其可视控件和视觉合成来触摸实际视图。
答案 1 :(得分:1)
我现在正在使用VS 2010 beta 2,它会定期执行最简单的WPF编码,比如尝试复制问题的代码:):但请考虑:
使用这种语法是否可以“做正确的事”:
public string dateNearest
{
get { return this.datePicker2.Text; }
set { this.datePicker2.Text = value; }
}
编辑1:好的,我的代码的WPF复制没有崩溃:使用上面的语法我可以在“其他窗口”中获取并设置属性。
编辑2:代码也可以使用您的原始代码:)在我第一次看到它时,在我看来它是“正确的”。您在阅读之前是否设置了该属性? :据我所知,DateTimePicker的Text属性在首次创建时默认为空字符串。
编辑3:回应Rem的请求:
主窗口有一个按钮,'button1:测试设置并获取在第二个Window实例中定义的公共属性DTContent:'WindowAdded:这里是主要的那个按钮的Click事件处理程序窗口的代码:
private void button1_Click(object sender, RoutedEventArgs e)
{
WindowAdded wa = new WindowAdded();
wa.DTContent = DateTime.Now.ToString();
Console.WriteLine("dt = " + wa.DTContent);
}
编辑4:一个更好的“真实世界”示例:大多数情况下,您将要创建另一个窗口的实例,并保持它,以便重复使用:imho: not 它只存在于按钮的Click事件范围内。请考虑一下:
在主窗口代码范围内的某个地方为您要添加的窗口定义一个“占位符”:private WindowAdded wa;
在事件中,您选择最适合创建该窗口的实例:创建实例,并分配给您的“占位符”变量:然后根据需要重新使用它。在WinForms中,我经常创建必需的辅助窗口,我需要重新使用对主窗体加载或显示事件中访问它们的实例的引用。
讨论:当然,如果你的意图是创建“临时”窗口,并且你不需要再次重新使用对新窗口实例的引用,那么在某个函数的范围内创建它就可以了。
并且,如果您在第二个窗口上唯一需要访问的是DateTimePicker,那么您使用上面建议的相同技术,但只创建并保持对DateTimePicker实例的引用。
答案 2 :(得分:0)