C# XAML绑定允许按实例访问静态成员?
WPF/Silverlight应用程序有一种常见的本地化技术,它在C# XAML绑定允许按实例访问静态成员?,c#,wpf,xaml,C#,Wpf,Xaml,WPF/Silverlight应用程序有一种常见的本地化技术,它在.resx生成的文件周围包含一个viewmodel包装器。所有绑定都引用此包装器的同一实例的属性,因此此属性上的单个NotifyPropertyChanged会自动刷新整个UI 例如,这是Locale类: public class Locale: ViewModelBase { public LocalizedStrings Strings {get;} = new LocalizedStrings(); publ
.resx
生成的文件周围包含一个viewmodel包装器。所有绑定都引用此包装器的同一实例的属性,因此此属性上的单个NotifyPropertyChanged
会自动刷新整个UI
例如,这是Locale
类:
public class Locale: ViewModelBase
{
public LocalizedStrings Strings {get;} = new LocalizedStrings();
public UpdateLocale()
{
NotifyPropertyChanged(nameof(Strings));
}
}
这就是约束力:
<Application.Resources>
<ns:Locale x:Key="Locale" />
</Application.Resources>
<TextBlock Text="{Binding Source={StaticResource Locale}, Path=Strings.MyString1" />
.resx编译器生成的本地化字符串的所有字段都是静态的
这意味着您不能在C#code中使用new Locale().Strings.MyString1
,而应该使用LocalizedStrings.MyString1
,但在绑定中它却出人意料地工作
问题是,为什么?这是正确的方法还是有更好的方法?好吧,绑定不是“新的”,而是与现有的关联……所以为什么不呢。@GCamel问题是,你不能在C中的
LocalizedString
实例上访问MyString1
——你需要类型名称本身。这里的new
操作符只是获取此实例的一个示例。ho,,我不知道LocalizedStrings中有什么,但看起来像是动力学…很正常的“问题是,为什么?”仅仅因为WPF设计师已经这样构建了它。绑定使用反射,它只查找非静态和静态属性。@GCamel否,dynamic
也不允许通过实例访问静态字段