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

Posted

技术标签:

【中文标题】使用依赖属性解决“无法在静态上下文中访问非静态属性”的另一种方法【英文标题】:An alternative way around 'Cannot access non-static property in static context' using dependency property 【发布时间】:2021-08-20 03:53:22 【问题描述】:

我有一个字符串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

【问题讨论】:

请注意,由于 NewValue 可以为空,e.NewValue.ToString() 应为e.NewValue as stringe.NewValue?.ToString() 【参考方案1】:

从字面上理解您的问题,您只需为方法转换 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())。

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

除非您在问题中未描述某些特定需求,否则您可以完全删除该方法。 (即使您确实有这样的需求,您也应该对此提出不同的问题,因为考虑到它引导您找到的代码,您似乎正在错误地满足 的需求。)

【讨论】:

以上是关于使用依赖属性解决“无法在静态上下文中访问非静态属性”的另一种方法的主要内容,如果未能解决你的问题,请参考以下文章

spring为啥要使用三级缓存解决循环依赖

Spring如何解决循环依赖?

WPF教程:依赖属性

接口自动化使用反射解决数据依赖问题

WPF非依赖属性绑定的问题

WPF依赖属性详解