使用依赖属性解决“无法在静态上下文中访问非静态属性”的另一种方法
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 string
或e.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()
)。
再次将属性设置为与刚刚设置的值相同的值,以响应已设置的属性,这对我来说似乎没有意义。
除非您在问题中未描述某些特定需求,否则您可以完全删除该方法。 (即使您确实有这样的需求,您也应该对此提出不同的问题,因为考虑到它引导您找到的代码,您似乎正在错误地满足 的需求。)
【讨论】:
以上是关于使用依赖属性解决“无法在静态上下文中访问非静态属性”的另一种方法的主要内容,如果未能解决你的问题,请参考以下文章