我有资源文件:Strings \ en-US \ Resources.resw
我正试图从这个文件中绑定一个字符串,如下所示:
<TextBlock Text="{Binding Path=LocalizedResources.app_name, Source={StaticResource LocalizedStrings}}" />
我想这种方法是错误的,因为我得到“资源'TestString'无法解决。”
如何从资源文件绑定到字符串?
PS:我在资源文件中有TestString。
PPS:我需要使用Studio 2012而不是Windows 8.1应用程序创建Windows 8商店应用程序。
答案 0 :(得分:1)
有一个工具 - 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 ...
}
然后在相应的View代码隐藏.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}
绑定您的值。我们正在创建View Model类的实例,该实例将是当前页面的DataConext。绑定系统将查找相应的属性名称。如果找到它们,则会在UI上显示这些值。如果没有,则不会发生错误,但是如果您期望值,则不会显示任何错误。
您可以找到有关此模式的大量文档资源,只需搜索 MVVM(模型 - 视图 - 视图模型) 。
答案 1 :(得分:1)
您可以使用Windows Phone项目中的相同文件,但首先,您应该将本地化移动到PCL - 可移植类库。在这种情况下,您将以与Windows Phone中相同的方式使用本地化。请read this tutorial - 这一点都不难。
答案 2 :(得分:0)
我hava创造了一种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属性设置为随机的同一个东西。我可以将字符串名称/键放在DataContext中,但这样我就无法使用DataContext实现其目的。
答案 3 :(得分:0)
由于您已经拥有一个使用资源文件的Windows Phone 8应用程序,因此可以轻松地为您的Windows应用商店应用程序工作。您需要做的就是复制WinPhone应用程序中WinStore应用程序中的结构。
希望有所帮助!