动态设置TextBlock的文本绑定

时间:2010-03-30 04:04:17

标签: c# silverlight

我正在尝试在Silverlight 4.0中编写多语言应用程序,我可以开始用SampleData xaml文件中的动态文本替换静态文本。这就是我所拥有的:

我的数据库

<SampleData:something xmlns:SampleData="clr-namespace:Expression.Blend.SampleData.MyDatabase" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <SampleData:something.mysystemCollection>
    <SampleData:mysystem ID="1" English="Menu" German="Menü" French="Menu" Spanish="Menú" Swedish="Meny" Italian="Menu" Dutch="Menu" />
  </SampleData:something.mysystemCollection>
</SampleData:something>

我的用户控件

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
    x:Class="Something.MyUC" d:DesignWidth="1000" d:DesignHeight="600">
    <Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource MyDatabase}}">
        <Grid Height="50" Margin="8,20,8,0" VerticalAlignment="Top" d:DataContext="{Binding mysystemCollection[1]}" x:Name="gTitle">
            <TextBlock x:Name="Title" Text="{Binding English}" TextWrapping="Wrap" Foreground="#FF00A33D" TextAlignment="Center" FontSize="22"/>
        </Grid>
    </Grid>
</UserControl>

如您所见,我有7种语言可以处理。现在这加载我的文本的英文版就好了。今天我花了很多时间试图找出如何更改我的代码中的绑定以在需要时交换它(让我说当我通过下拉更改语言时)。

2 个答案:

答案 0 :(得分:2)

听起来你正在寻找这样的代码:

Title.SetBinding(TextProperty, new Binding { Path = new PropertyPath(language) });

它只是为您请求的语言创建一个新的Binding,并使用它来替换Title的Text属性的旧绑定。

答案 1 :(得分:1)

你这是错误的方式。 Silverlight中本地化的最佳实践是使用包含已翻译关键字的资源文件。以下是有关此内容的更多信息:

http://msdn.microsoft.com/en-us/library/cc838238%28VS.95%29.aspx

修改

这是一个使用帮助器类来保存已翻译字符串的示例。然后可以从几乎任何地方加载这些翻译。静态资源文件,xml,数据库或其他。我匆忙做了这个,所以它不是很稳定。它只在英语和瑞典语之间切换。

XAML:

<UserControl x:Class="SilverlightApplication13.MainPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:local="clr-namespace:SilverlightApplication13"
             mc:Ignorable="d"
             d:DesignWidth="640"
             d:DesignHeight="480">

    <UserControl.Resources>
        <local:TranslationHelper x:Key="TranslationHelper"></local:TranslationHelper>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot">
        <StackPanel>

            <TextBlock Margin="10"
                       Text="{Binding Home, Source={StaticResource TranslationHelper}}"></TextBlock>

            <TextBlock Margin="10"
                       Text="{Binding Contact, Source={StaticResource TranslationHelper}}"></TextBlock>

            <TextBlock Margin="10"
                       Text="{Binding Links, Source={StaticResource TranslationHelper}}"></TextBlock>

            <Button Content="English"
                    HorizontalAlignment="Left"
                    Click="BtnEnglish_Click"
                    Margin="10"></Button>

            <Button Content="Swedish"
                    HorizontalAlignment="Left"
                    Click="BtnSwedish_Click"
                    Margin="10"></Button>
        </StackPanel>
    </Grid>
</UserControl>

代码隐藏+ TranslationHelper类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Threading;
using System.ComponentModel;

namespace SilverlightApplication13
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            //Default
            (this.Resources["TranslationHelper"] as TranslationHelper).SetLanguage("en-US");
        }

        private void BtnEnglish_Click(object sender, RoutedEventArgs e)
        {
            (this.Resources["TranslationHelper"] as TranslationHelper).SetLanguage("en-US");
        }

        private void BtnSwedish_Click(object sender, RoutedEventArgs e)
        {
            (this.Resources["TranslationHelper"] as TranslationHelper).SetLanguage("sv-SE");
        }
    }

    public class TranslationHelper : INotifyPropertyChanged
    {
        private string _Contact;

        /// <summary>
        /// Contact Property
        /// </summary>
        public string Contact
        {
            get { return _Contact; }
            set
            {
                _Contact = value;
                OnPropertyChanged("Contact");
            }
        }

        private string _Links;

        /// <summary>
        /// Links Property
        /// </summary>
        public string Links
        {
            get { return _Links; }
            set
            {
                _Links = value;
                OnPropertyChanged("Links");
            }
        }

        private string _Home;

        /// <summary>
        /// Home Property
        /// </summary>
        public string Home
        {
            get { return _Home; }
            set
            {
                _Home = value;
                OnPropertyChanged("Home");
            }
        }



        public TranslationHelper()
        {
            //Default
            SetLanguage("en-US");
        }

        public void SetLanguage(string cultureName)
        {
            //Hard coded values, need to be loaded from db or elsewhere

            switch (cultureName)
            {
                case "sv-SE":
                    Contact = "Kontakt";
                    Links = "Länkar";
                    Home = "Hem";
                    break;

                case "en-US":
                    Contact = "Contact";
                    Links = "Links";
                    Home = "Home";
                    break;

                default:
                    break;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}