来自C#WPF中另一个类的访问控制属性

时间:2009-12-30 06:24:50

标签: c# wpf class controls properties

我在课堂之间的可见性很混乱。请帮我解决这个新手问题。

我有两个控件(来自默认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中的值,但我想首先了解基础知识。

3 个答案:

答案 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的请求:

  1. 主窗口有一个按钮,'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);
    }
    
  2. 编辑4:一个更好的“真实世界”示例:大多数情况下,您将要创建另一个窗口的实例,并保持它,以便重复使用:imho: not 它只存在于按钮的Click事件范围内。请考虑一下:

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

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

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

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

答案 2 :(得分:0)

正如其他人已经指出的那样,这可能不是可行的方法,但您可以使用:

<object x:FieldModifier="public".../>

将对象设置为public。 有关详细信息,请参阅msdn