Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问控制&x27;C#WPF中另一个类的s属性_C#_Wpf_Class_Controls_Properties - Fatal编程技术网

访问控制&x27;C#WPF中另一个类的s属性

访问控制&x27;C#WPF中另一个类的s属性,c#,wpf,class,controls,properties,C#,Wpf,Class,Controls,Properties,我在班级之间的可视性上搞得一团糟。请帮我回答这个新手问题 我有两个控件(来自默认WPF工具箱的日期选择器),它们位于不同的窗口中,因此位于不同的类中。我可以从其本机类(即在其本机窗口)中轻松访问这些控件属性,如datePicker1.Text,但当我尝试从另一个窗口访问datePicker1.Text时,我什么也得不到 我尝试使用代码中对窗口的引用,将一个日期选择器的值分配给另一个日期选择器: string testStr; ... AnotherWindow aw = new AnotherW

我在班级之间的可视性上搞得一团糟。请帮我回答这个新手问题

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

我尝试使用代码中对窗口的引用,将一个日期选择器的值分配给另一个日期选择器:

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中还有其他访问值的方法,如数据绑定,但我想先了解基本知识。

不幸的是,WPF的基本知识是数据绑定。以任何其他方式这样做都是“违背常规的”,是一种不好的做法,而且通常要比编码和理解复杂好几个数量级

对于您手头的问题,如果有数据要在视图之间共享(即使只有一个视图),请创建一个视图模型类,其中包含表示数据的属性,并绑定到视图中的属性


在您的代码中,只管理视图模型类,不要用它的视觉控件和视觉构图来触摸实际视图。

< P>我现在使用VS 2010 beta 2,它经常崩溃,做最简单的WPF编码,就像试图复制您的问题代码:):但是请考虑:

使用此语法是否可能“做正确的事情”:

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

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

编辑3:响应Rem的请求:

  • 主窗口有一个按钮button1:用于测试设置和获取第二个窗口实例中定义的公共属性DTContent,该窗口名为:WindowAdded:以下是主窗口代码中该按钮的“单击事件处理程序”:

    private void button1_Click(object sender, RoutedEventArgs e)
    {
      WindowAdded wa = new WindowAdded();    
      wa.DTContent = DateTime.Now.ToString();
      Console.WriteLine("dt = " + wa.DTContent);
    }
    
  • 编辑4:一个更好的“真实世界”示例:大多数情况下,您希望创建另一个窗口的实例,并保留该实例以供重复使用:imho:不要让它仅存在于按钮单击事件的范围内。请考虑:

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

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

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


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

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

    <object x:FieldModifier="public".../>
    
    
    
    将对象设置为公共。
    有关更多信息,请参阅。

    不,尽管如此,它仍然不起作用。顺便说一句,感谢您分享关于VS 2010 beta 2的经验。关于您的编辑2,请在代码中说明如何在另一个窗口中访问datePicker2.Text?此解决方案将在@rem解决您的问题。窗口1中DatePicker的Text属性仅在窗口1的范围内可见。在window类中将其作为公共属性公开将允许从window 2查看和操作。@Russell,我将Window1称为主窗口,Window2称为“辅助”窗口,该窗口是由Window1中的代码创建的:在这种情况下,我们取决于Window1作为Window2的“创建者”的事实,有权访问对Window2实例的引用及其公共“无论如何”。我的示例显示了在按钮单击事件中创建的新窗口,在某种程度上是“真实代码”的一个糟糕示例,因为对Window2实例的引用将仅存在于Window1上的按钮单击事件的范围内。我得做点什么!谢谢,@Ray:无论如何,请用更好的方式展示OP!帮他看看为什么更好。当你看到一个更好的方法在这里演示时,请接受这个答案作为你接受的答案。我的印象是程序员可以自由选择在C#vs.XAML中工作的程度。我回答了OP非常具体的问题。没错,数据绑定和MVVM是WPF设计的主要模型。然而,我的经验表明,我们需要一种软方法来帮助将windows窗体设计技术转换为WPF。我的经验是,如果您试图将最糟糕的WinForms设计技术“转换”到WPF,那么您的开发人员最终会连续多年产生糟糕的设计。您甚至可能不得不用其他开发人员来替换它们,以获得像样的WPF代码。另一方面,如果你向他们展示如何使用WPF和MVVM更轻松地完成当前任务,他们将永远不会走上错误的道路,从长远来看,情况会好得多。我同意两种相互矛盾的观点。最佳实践是“最佳实践”
    <object x:FieldModifier="public".../>