我有资源文件:Strings\en-US\Resources.resw
我正试图绑定到这个文件中的字符串,如下所示:
<TextBlock Text="{Binding Path=LocalizedResources.app_name, Source={StaticResource LocalizedStrings}}" />
我想这种方法是错误的,因为我得到"资源‘TestString’无法解析。"。
如何绑定到资源文件中的字符串?
PS:我在资源文件中有TestString。
PPS:我需要用Studio 2012创建Windows 8商店应用程序,而不是Windows 8.1应用程序。
您可以使用Windows Phone项目中的相同文件,但首先,您应该将本地化移到PCL-Portable类库中。在这种情况下,您将以与Windows Phone相同的方式使用本地化。请阅读本教程,它一点也不难。
有一个工具-PublicResXFileCodeGenerator
,您可以使用它来访问这种情况下的资源文件值:
MyResourceFile.ResourceString;
您可以将该值存储到属性中,然后将其绑定到UI上。
绑定方法的编辑
您需要一个ViewModel,它将在该视图上设置为DataContext
。
假设您的资源文件中有三行值:FirstName、LastName和Age。所以你会访问它们,比如:
string firstName = MyResourceFile.FirstName;
string lastName = MyResourceFile.LastName;
int age = Convert.ToInt32(MyResourceFile.Age); //made it an int
您必须创建一个类,该类将作为您的ViewModel。
public class MyViewModelClass : INotifyPropertyChanged
{
private string firstName;
public string FirstName
{
get { return firstName; }
set { firstName = value; OnPropertyChanged(); }
}
private string lastName;
public string LastName
{
get { return lastName; }
set { lastName = value; OnPropertyChanged(); }
}
private string age;
public string Age
{
get { return age; }
set { age= value; OnPropertyChanged(); }
}
//Also the INotifyProperty members ...
}
然后在.cs文件后面的相应视图代码中:
1) 定义并声明MyViewModelClass
的一个实例。
public MyViewModelClass viewModel = new MyViewModelClass();
2) 将DataContext
设置为先前设置的实例。
this.DataContext = this.viewModel;
3) 添加资源文件中的值:
this.viewModel.FirstName = MyResourceFile.FirstName;
this.viewModel.LastName = MyResourceFile.LastName;
this.viewModel.Age = MyResourceFile.Age;
4) 将它们绑定到XAML中:
<TextBlock Text="{Binding FirstName}" />
<TextBlock Text="{Binding LastName}" />
<TextBlock Text="{Binding Age}" />
//The names of the public properties in the View Model class
我对这一切感到困惑!这些都是什么意思
如果您使用INotifyPropertyChanged
,您将能够在绑定值更改时自动更新UI。这是因为在每个属性的setter
中,都有一个OnPropertyChange();
调用,它将通知UI值的更改。OnPropertyChange()调用应始终在之后,否则,这些更改将不会反映在UI上。
每个页面都有一个DataContext
(不仅是页面,还有许多元素)。从中,您可以使用XAML中的{Binding something}
绑定您的值。我们正在创建ViewModel类的一个实例,该实例将是当前页面的DataConext。绑定系统将查找相应的属性名称。如果找到了这些值,则会在UI上显示这些值。如果不是,则不会出现错误,但在您期望值的位置,则不会显示任何内容。
您可以找到许多关于此模式的文档资源,只需搜索MVVM(模型视图视图模型)即可。
我创建了一个myown:的方法
1) 在App.xaml 中
<localUtils:ResourceStringConventer x:Key="LocalizedStringsConventer" ></localUtils:ResourceStringConventer>
2) ResourceStringConventer
public class ResourceStringConventer : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
ResourceLoader resourceLoader = new ResourceLoader();
string text = resourceLoader.GetString((string)parameter);
return text;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
3) 绑定
<TextBlock Text="{Binding Converter={StaticResource LocalizedStringsConventer}, ConverterParameter='TestString'}" DataContext="dgsdf" />
我看到的唯一缺点是,必须将XAML中的DataContext属性设置为相同的随机属性。我本可以把字符串name/key放在DataContext中,但这样我就无法将DataContext用于其真正的目的。
由于您已经有一个使用资源文件的Windows Phone 8应用程序,因此很容易为您的Windows应用商店应用程序提供相同的功能。你所需要做的就是在你的WinStore应用程序中复制你在WinPhone8应用程序中的结构。
- 在WinStore应用程序中创建LocatedStrings类
- 将该类的内容从WinPhone复制并粘贴到WinStore
- 在应用程序中添加新的资源文件夹
- 添加一个名为AppResources的新资源文件。对于VS2012+Windows 8应用程序,您将找到Resource.resw文件。使用此类型
- 在解决方案资源管理器中单击该文件
- 打开Properties Windows并将"PublicResXFileCodeGenerator"粘贴到Custom Tool属性中(不带单引号)
- 在App.xaml中,在ResourceDictionary元素中添加以下内容(更改名称空间以匹配您自己的名称空间)
- 以与Windows Phone 8应用程序中相同的方式更改xaml中的文本值text="{Binding Path=LocalizedResources.Test,Source={StaticResource LocalizedStrings}}">
希望能有所帮助!