使用C#和XAML在Windowsapp store应用中绑定资源文件值字符串

我有资源文件:Strings \ en-US \ Resources.resw

我正试图从这个文件绑定到一个字符串,如下所示:

 

我想这种方法是错误的,因为我得到“资源’TestString’无法解决。”

如何从资源文件绑定到字符串?


PS:我在资源文件中有TestString。

PPS:我需要使用Studio 2012而不是Windows 8.1应用程序创建Windows 8商店应用程序。

您可以使用Windows Phone项目中的相同文件,但首先,您应该将本地化移动到PCL – 可移植类库。 在这种情况下,您将以与Windows Phone中相同的方式使用本地化。 请阅读本教程 – 这一点都不难。

有一个工具 – PublicResXFileCodeGenerator ,您可以使用它来访问资源文件值:

 MyResourceFile.ResourceString; 

您可以将该值存储到属性中,然后在UI上将其绑定。

编辑绑定方法

您将需要一个ViewModel,它将被设置为该View上的DataContext

假设您的资源文件中有三行包含值: FirstName,LastNameAge 。 因此,您将访问它们,如:

 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中:

    //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(Model-View-ViewModel)

我hava创造了一种myown的方法:

1)在App.xaml中

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)绑定

我看到的唯一骗局是你必须将XAML中的DataContext属性设置为随机的同一个东西。 我可以将字符串名称/键放在DataContext中,但这样我就无法将DataContext用于其真正的目的。

由于您已经拥有一个使用资源文件的Windows Phone 8应用程序,因此可以轻松地为您的Windowsapp store应用程序工作。 您需要做的就是复制WinPhone应用程序中的WinStore应用程序中的结构。

  1. 在WinStore应用程序中创建一个LocationStrings类
  2. 将该类的内容从WinPhone复制并粘贴到WinStore
  3. 在您的应用中添加一个新的Resources文件夹
  4. 添加名为AppResources的新资源文件。 对于VS2012 + Windows 8应用程序,您将找到Resource.resw文件。 使用此类型。
  5. 单击解决方案资源管理器中的文件。
  6. 打开属性Windows并将“PublicResXFileCodeGenerator”粘贴到“自定义工具”属性中(不带单引号)
  7. 在App.xaml中,在ResourceDictionary元素中添加以下内容(更改名称空间以匹配您自己的名称空间)
  8. 以与Windows Phone 8应用程序相同的方式更改xaml中的文本值Text =“{Binding Path = LocalizedResources.Test,Source = {StaticResource LocalizedStrings}}”

希望有所帮助!