2015-02-26 1 views
0

Я пытаюсь внедрить систему выбора языка для моего приложения wmf mytimeui. Когда язык переключается с выпадающего списка, это изменение будет распространено на все элементы управления приложениями посредством привязки данных. Я построил скелет следующим образом:wpf привязка данных: обновление целей в разных представлениях через datacontext

  • языков являются объектами, собранными в списке
  • строка и их аналоги хранятся в статическом словаре
  • данные для связывания забирается объектом перевода
  • взглядов привязка к DataContext, который основан на рамках

Ниже языка является урезанной версией functionalty и ссылка на образец vs2013 проект. Я попытался выполнить INotify .. без успеха, мне удалось только обновить цель привязки, сбросив datacontext представления (page1.xaml). К сожалению, не удалось обновить цель на другом представлении (home.xaml). Вопрос сводится к: «Как обновлять все цели во всех представлениях одновременно?» Буду признателен за любую помощь и предложения по настройке правильной структуры привязки.

скачать образец проекта: http://goo.gl/yjSsKm

home.xaml

<Grid Style="{StaticResource ContentRoot}"> 
    <ScrollViewer> 
     <StackPanel MinWidth="200"> 
      <TextBlock Text="{Binding home_text_1}"/> 
     </StackPanel> 
    </ScrollViewer> 
</Grid> 

page1.xaml

<Grid Style="{StaticResource ContentRoot}"> 
    <ScrollViewer> 
     <StackPanel MinWidth="200"> 
      <TextBlock Text="{Binding page1_text_1}"/> 
      <ComboBox x:Name="cbox_lang" Width="120" HorizontalAlignment="Left" Margin="0,50,0,0" SelectionChanged="cbox_lang_SelectionChanged"/> 
     </StackPanel> 
    </ScrollViewer> 
</Grid> 

MainWindow.xaml.cs

using DynamicDataBinding.Pages; 
using FirstFloor.ModernUI.Windows.Controls; 

namespace DynamicDataBinding 
{ 
    public partial class MainWindow : ModernWindow 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      Language lang_1 = new Language("Language 1"); 
      Language lang_2 = new Language("Language 2"); 
      Global.availableLanguages.Add(lang_1); 
      Global.availableLanguages.Add(lang_2); 
      Global.currentLanguage = lang_1; 
      Global.currentLanguage.set(); 
     } 
    } 
} 

page1.xaml.cs

using System.Collections.Generic; 
using System.Windows.Controls; 

namespace DynamicDataBinding.Pages 
{ 
    public partial class Page1 : UserControl 
    { 
     public Page1() 
     { 
      InitializeComponent(); 
      foreach (Language lang in Global.availableLanguages) 
      { 
       cbox_lang.Items.Add(lang.Name); 
      } 
      cbox_lang.SelectedItem = Global.currentLanguage.Name; 
      this.DataContext = Global.currentLanguage.FrameWork; 
     } 

     private void cbox_lang_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      if (cbox_lang.SelectedItem.ToString() != Global.currentLanguage.Name) 
      { 
       string selectedLanguage = cbox_lang.SelectedItem.ToString(); 
       Global.currentLanguage = Global.availableLanguages.Find(lang => lang.Name == selectedLanguage); 
       Global.currentLanguage.set(); 
       DataContext = null; 
       DataContext = Global.currentLanguage.FrameWork; 
      } 
     } 
    } 

    public class Global 
    { 
     public static Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
     public static List<Language> availableLanguages = new List<Language>(); 
     public static Language currentLanguage; 
    } 

    public class Language 
    { 
     public string Name; 
     public Translation FrameWork; 

     public Language(string name) 
     { 
      this.Name = name; 
     } 

     public void set() 
     { 
      Global.dictionary.Clear(); 
      if (Global.currentLanguage.Name == "Language 1") 
      { 
       Global.dictionary.Add("home_content_1", "Content For Home in Language 1"); 
       Global.dictionary.Add("page1_content_1", "Content For Page1 in Language 1"); 
      } 
      else if (Global.currentLanguage.Name == "Language 2") 
      { 
       Global.dictionary.Add("home_content_1", "Different Content For Home in Language 2"); 
       Global.dictionary.Add("page1_content_1", "Different Content For Page1 in Language 2"); 
      } 
      FrameWork = new Translation(); 
     } 
    } 

    public class Translation 
    { 
     public string home_text_1 { get { return Global.dictionary["home_content_1"]; } } 
     public string page1_text_1 { get { return Global.dictionary["page1_content_1"]; } } 
    } 
} 

home.xaml.cs

using System.Windows.Controls; 
namespace DynamicDataBinding.Pages 
{ 
    public partial class Home : UserControl 
    { 
     public Home() 
     { 
      InitializeComponent(); 
      this.DataContext = Global.currentLanguage.FrameWork; 
     } 
    } 
} 
+0

Взглядами кода я призываю вас посмотреть на [MVVM учебник] (HTTP: //www.codeproject .com/Статьи/819294/WPF-MVVM шаг за шагом основы-на-Advance-Level). – XAMlMAX

+0

Я знаю, что эта структура плохо соответствует структуре mvvm. Я все еще участвую, и я буду признателен за все предложения по исправлению неэффективных механизмов. –

ответ

0

В конце дня (в конце концов) я понял, что нет необходимости иметь дело с DataContext. Внедрение INotifyPropertyChanged обрабатывает все целевые обновления, если они настроены правильно. Кроме того, использование словаря не подходит для хранения данных, если проблема связана. Ниже приводится исправленная версия кода:

page1.xaml.cs

using System.Collections.Generic; 
using System.ComponentModel; 
using System.Windows.Controls; 

namespace DynamicDataBinding.Pages 
{ 
    /// <summary> 
    /// Interaction logic for Page1.xaml 
    /// </summary> 
    public partial class Page1 : UserControl 
    { 
     public Page1() 
     { 
      InitializeComponent(); 
      foreach (Language lang in Global.availableLanguages) 
      { 
       cbox_lang.Items.Add(lang.Name); 
      } 
      cbox_lang.SelectedItem = Global.currentLanguage.Name; 
      this.DataContext = Global.FrameWork; 
     } 

     private void cbox_lang_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      if (cbox_lang.SelectedItem.ToString() != Global.currentLanguage.Name) 
      { 
       string selectedLanguage = cbox_lang.SelectedItem.ToString(); 
       Global.currentLanguage = Global.availableLanguages.Find(lang => lang.Name == selectedLanguage); 
       Global.currentLanguage.set(); 
       DataContext = null; 
       DataContext = Global.FrameWork; 
      } 
     } 
    } 

    public class Global 
    { 
     public static Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
     public static List<Language> availableLanguages = new List<Language>(); 
     public static Language currentLanguage; 
     public static Translation FrameWork = new Translation(); 
    } 

    public class Language 
    { 

     public string Name; 
     public Language(string name) 
     { 
      this.Name = name; 
     } 

     public void set() 
     { 
      Global.dictionary.Clear(); 
      if (Global.currentLanguage.Name == "Language 1") 
      { 
       Global.FrameWork.home_text_1 = "Content For Home in Language 1"; 
       Global.FrameWork.page1_text_1 = "Content For Home in Language 1"; 

      } 
      else if (Global.currentLanguage.Name == "Language 2") 
      { 
       Global.FrameWork.home_text_1 = "Different Content For Home in Language 2"; 
       Global.FrameWork.page1_text_1 = "Different Content For Home in Language 2"; 
      } 
     } 
    } 

    public class Translation : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     private void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     private string _home_text_1; 
     private string _page1_text_1; 

     public string home_text_1 { get {return _home_text_1;} set { _home_text_1 = value; OnPropertyChanged("home_text_1"); }} 
     public string page1_text_1 { get {return _page1_text_1;} set { _page1_text_1 = value; OnPropertyChanged("page1_text_1");}} 
    } 
} 
Смежные вопросы