0

所以我在让我的依赖属性工作时遇到了一些问题。但实际上只有当我试图从不同的类访问它们时。

例如,我正在检查 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 中,我可以检查该值并按预期​​获得“真”但是当尝试在第 2 课中做同样的事情,我只是每次都得到“假”)。

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

问候

4

3 回答 3

1

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

切勿在 CLR 包装器 ( public bool PingState) 中放置其他代码。正确访问属性时,绑定系统或其他方式不会调用它。要获得属性更改的回调,请在属性注册时使用元数据

于 2016-08-11T16:24:24.950 回答
0

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

于 2016-08-11T17:40:04.377 回答
-1

感谢@aQsu,我能够以不同的方式解决这个问题。我现在使用 Singleton 来获取如下实例:

        private static MainWindow _instance;

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

            return _instance;
        }
    }

然后只需调用 UserControl

            bool ping = MainWindow.Instance.PingState;
于 2016-08-11T18:05:12.387 回答