依赖属性GetValue在不同的类
所以我有一些问题让我的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”,但在尝试在第二课中做同样的事情我每次都会变得“虚假”)。
在这种情况下,我需要附加属性吗?与他们也试了一下,但不幸的是无济于事。
问候
如果您需要该属性的值,则需要包含该值的实例,如前面的评论和答案中所述。使用setter/singleton或任何适合你的方法获取实例。依赖/附加属性不会解决您的问题。 (如果你想绑定到属性,请使用依赖项属性。)
这实际上真的让我受益匪浅。事情是,我不需要将它绑定在那里,我只需要在用户控制中进一步分析的价值。将发表一个答案,我已经做到了。谢谢并标记为答案(尽管现在标题可能有点误导......)。 – CuttingWide
除非您之前设置过,否则无法获取该值。如果目标对象是相同类型或衍生的目标对象,则只能设置该值,除非它是附加属性。调用GetValue
像这样不是从主窗口获取属性,它从当前实例(用户控件)获取属性。
从不将额外的代码放在CLR包装中(public bool PingState
)。它不会被绑定系统或其他正确访问属性时调用。要获得更改回叫的财产,请使用metadata,电话号码property registration。
好的,谢谢你的回答。提到CLR包装问题当然是正确的,那么我会改变这一点。但是关于实际的事情:我明白了,那么我需要一个附加属性。但是我能找到的通常的教程是从同一个线程那里做的。如何从dfiferent(我的用户控件)调用它? – CuttingWide
@CuttingWide从这里开始阅读:[附加属性概述](https://msdn.microsoft.com/en-us/library/ms749011(v = vs.110).aspx)。 – Clemens
@CuttingWide:如果你的UserControl实际上在另一个线程上,你可能做错了,它会使一切变得复杂。正如你接受另一个答案,我假设你只是指在这里从另一个班的访问。 –
感谢@aQsu我能够以不同的方式对它进行排序。我现在使用一个Singleton来获得实例如下所示:
private static MainWindow _instance;
public static MainWindow Instance
{
get
{
if (_instance == null)
_instance = new MainWindow();
return _instance;
}
}
然后简单地调用在用户控件
bool ping = MainWindow.Instance.PingState;
我会建议不要让主窗口成为单身人士。已经有一个显着的单例,也就是'Application',所以我通常将'App'类的实例属性定义为'Application.Current'(需要强制转换),所以我通常会覆盖'Current'包含在'App'类中,因此'App.Current'返回一个'App'实例。) –
应用程序还有一个'MainWindow'属性(与'ShutdownMode'相关),你可以设置到您的实例,尽管您可能也想要使用正确类型的实例隐藏该属性。 –
你得到了错误的实例的值。 – SLaks