问题描述
我有一个字符串 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()
)。
将属性再次设置为与刚刚设置的值相同的值,以响应已设置的属性,对我来说似乎没有意义。
除非您在问题中没有描述某些特定需求,否则您可以完全删除该方法。 (即使您确实有这样的需求,您也应该就此提出一个不同的问题,因为鉴于它引导您到的代码,您似乎正在错误地服务那个需求。)