2016-08-11 64 views
0

所以我有一些问题让我的Depency属性工作。但事实上,只有当我试图从不同的班级访问他们时。依赖属性GetValue在不同的类

比如我做一个检查来ping服务器和定义相应的依赖项属性:

 public static DependencyProperty PingStateProperty = 
     DependencyProperty.Register("PingState", typeof(bool), 
     typeof(MainWindow)); 

    public bool PingState 
    { 
     get { return (bool)GetValue(PingStateProperty); } 
     set 
     { 
      SetValue(PingStateProperty, value); 
      PropertyChanged(this, new PropertyChangedEventArgs("PingState")); 
     } 
    } 

现在我想获得在不同的类从依赖项属性的值(具体用户控制)。所以我有另一个类,我试图得到这样的价值:

public void MethodInClass2() 
    { 
     bool ping = (bool)GetValue(MainWindow.PingStateProperty); 

我在做什么错在这里?错误的是:当我在同一个类中调用GetValue时,它正在工作。它不会给我一个编译错误或类似的东西,它似乎只是没有传递正确的值(在定义了DP的类1中,我可以检查该值并按预期​​得到“true”,但在尝试在第二课中做同样的事情我每次都会变得“虚假”)。

在这种情况下,我需要附加属性吗?与他们也试了一下,但不幸的是无济于事。

问候

+0

你得到了错误的实例的值。 – SLaks

回答

0

如果您需要该属性的值,则需要包含该值的实例,如前面的评论和答案中所述。使用setter/singleton或任何适合你的方法获取实例。依赖/附加属性不会解决您的问题。 (如果你想绑定到属性,请使用依赖项属性。)

+0

这实际上真的让我受益匪浅。事情是,我不需要将它绑定在那里,我只需要在用户控制中进一步分析的价值。将发表一个答案,我已经做到了。谢谢并标记为答案(尽管现在标题可能有点误导......)。 – CuttingWide

0

除非您之前设置过,否则无法获取该值。如果目标对象是相同类型或衍生的目标对象,则只能设置该值,除非它是附加属性。调用GetValue像这样不是从主窗口获取属性,它从当前实例(用户控件)获取属性。

从不将额外的代码放在CLR包装中(public bool PingState)。它不会被绑定系统或其他正确访问属性时调用。要获得更改回叫的财产,请使用metadata,电话号码property registration

+0

好的,谢谢你的回答。提到CLR包装问题当然是正确的,那么我会改变这一点。但是关于实际的事情:我明白了,那么我需要一个附加属性。但是我能找到的通常的教程是从同一个线程那里做的。如何从dfiferent(我的用户控件)调用它? – CuttingWide

+0

@CuttingWide从这里开始阅读:[附加属性概述](https://msdn.microsoft.com/en-us/library/ms749011(v = vs.110).aspx)。 – Clemens

+0

@CuttingWide:如果你的UserControl实际上在另一个线程上,你可能做错了,它会使一切变得复杂。正如你接受另一个答案,我假设你只是指在这里从另一个班的访问。 –

-1

感谢@aQsu我能够以不同的方式对它进行排序。我现在使用一个Singleton来获得实例如下所示:

 private static MainWindow _instance; 

    public static MainWindow Instance 
    { 
     get 
     { 
      if (_instance == null) 
       _instance = new MainWindow(); 

      return _instance; 
     } 
    } 

然后简单地调用在用户控件

  bool ping = MainWindow.Instance.PingState; 
+1

我会建议不要让主窗口成为单身人士。已经有一个显着的单例,也就是'Application',所以我通常将'App'类的实例属性定义为'Application.Current'(需要强制转换),所以我通常会覆盖'Current'包含在'App'类中,因此'App.Current'返回一个'App'实例。) –

+1

应用程序还有一个'MainWindow'属性(与'ShutdownMode'相关),你可以设置到您的实例,尽管您可能也想要使用正确类型的实例隐藏该属性。 –