使用依赖属性解决“无法访问静态上下文中的非静态属性”的另一种方法

问题描述

我有一个字符串 source,我试图将它从我的 xaml 读入我的视图并分配给一个 DependencyProperty。我收到一个错误 Cannot access non-static property 'Source' in static context,我理解这个错误,但我不知道如何解决它。如果有人可以建议我如何将 Source 更新为 source 的值,请

public string Source
{
    get { return (string)GetValue(SourceProperty); }
    set { SetValue(SourceProperty,value); }
}

public static readonly DependencyProperty SourceProperty = 
    DependencyProperty.Register(
            nameof(Source),typeof(string),typeof(TagsIndicator),new PropertyMetadata(null,ReadInSource));            

private static void ReadInSource(DependencyObject d,DependencyPropertyChangedEventArgs e)
{
     string source = e.NewValue.ToString();

     Source = source; // Error here: Cannot access non-static property 'Source' in static context
}

解决方法

从字面上理解您的问题,您只需为该方法强制转换 d 参数:

private static void ReadInSource(DependencyObject d,DependencyPropertyChangedEventArgs e)
{
    TagsIndicator tagsIndicator = (TagsIndicator)d;
    string source = e.NewValue.ToString();

    tagsIndicator.Source = source; // Error here: Cannot access non-static property 'Source' in static context
}

那会使错误消失。

但是!

如果这就是您的回调要做的所有事情,那么真正的解决方案似乎就是删除回调方法(当然,不要将其注册到 DependencyProperty ).

依赖属性系统的全部意义在于 WPF 代表您管理属性值。该回调仅在依赖属性系统已更改属性时调用,例如通过绑定或直接设置属性本身(在属性设置器中调用 DependencyObject.SetValue())。

将属性再次设置为与刚刚设置的值相同的值,以响应已设置的属性,对我来说似乎没有意义。

除非您在问题中没有描述某些特定需求,否则您可以完全删除该方法。 (即使您确实有这样的需求,您也应该就此提出一个不同的问题,因为鉴于它引导您到的代码,您似乎正在错误地服务那个需求。)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...