2012-01-18 19 views
1

私はこのクラスWPF Comboboxにコードをカスタムクラスで埋め込む方法

public class UILanguagesModel : INotifyPropertyChanged 
    { 
     public UILanguagesModel() 
     { 
      IList<UILanguage> list = new List<UILanguage>(); 

      UILanguage english = new UILanguage(); 
      english.Culture = "en"; 
      english.SpecCulture = "en-US"; 
      english.EnglishName = "English";   

      UILanguage spanish = new UILanguage(); 
      spanish.Culture = "es"; 
      spanish.SpecCulture = "es-ES"; 
      spanish.EnglishName = "Spanish"; 

      list.Add(english); 
      list.Add(spanish); 
      _languages = new CollectionView(list); 
     } 
     private readonly CollectionView _languages; 
     private UILanguage _language; 

     public CollectionView Languages 
     { 
      get { return _languages; } 
     } 

     public UILanguage Language 
     { 
      get { return _language; } 
      set 
      { 
       if (_language == value) return; 
       _language = value; 
       OnPropertyChanged("Language"); 
      } 
     } 
     private void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
     public event PropertyChangedEventHandler PropertyChanged; 
    } 

    public sealed class UILanguage 
    { 
     public string EnglishName { set; get; } 

     public string Culture { set; get; } 

     public string SpecCulture { set; get; } 
    } 

を持っていると私は、 "EnglisgName" WPFコンボボックスを移入する必要があります。

どうすればよいですか?

ありがとうございました!


マークアップXAML

<ComboBox Grid.Column="1" Height="23" HorizontalAlignment="Left" Margin="0,1,0,0" 
        Name="cmbLanguages" VerticalAlignment="Top" Width="207" /> 
+0

マークアップを表示できますか? –

+0

@ShoaibShaikhはいここにあります。 –

+1

なぜこのような方法であなたのUIに多言語サポートを行っていますか?現在のシステムカルチャを検出することが可能です。私は読むことができない言語を選択させるプログラムが嫌いです。 –

答えて

3

などのアイテムのコレクションにコンボボックスをバインドするときは、通常のObservableCollectionとしてあなたのコレクションクラスを定義します

public class UILanguages : ObservableCollection<UILanguage> 
{ 
} 
を210

を開き、ComboBoxを、次のXAMLで宣言されているように、ObservableCollectionをSourceとして使用するCollectionViewSourceにバインドします。 CollectonViewSourceは、選択した項目のトラックを保持します。

<Window x:Class="ComboBoxTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:ComboBoxTest" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <local:UILanguages x:Key="UILanguages"/> 
     <CollectionViewSource x:Key="UILanguagesViewSource" Source="{StaticResource UILanguages}"/> 
    </Window.Resources> 
    <Grid> 
     <ComboBox Grid.Column="1" Height="23" HorizontalAlignment="Left" Margin="0,1,0,0" 
        Name="cmbLanguages" VerticalAlignment="Top" Width="207" 
        ItemsSource="{Binding Source={StaticResource UILanguagesViewSource}}"/> 
    </Grid> 
</Window> 

次にコレクションを移入:

UILanguages languages = (UILanguages)Resources["UILanguages"]; 

languages.Add(
    new UILanguage 
    { 
     Culture = "en", 
     SpecCulture = "en-US", 
     EnglishName = "English" 
    }); 

languages.Add(
    new UILanguage 
    { 
     Culture = "es", 
     SpecCulture = "es-ES", 
     EnglishName = "Spanish" 
    }); 

このようにXAMLリソース宣言を避け、コード内のObservableCollectionとCollectionViewSourceを定義することももちろん可能である:

UILanguages languages = new UILanguages(); 

languages.Add(
    new UILanguage 
    { 
     Culture = "en", 
     SpecCulture = "en-US", 
     EnglishName = "English" 
    }); 

languages.Add(
    new UILanguage 
    { 
     Culture = "es", 
     SpecCulture = "es-ES", 
     EnglishName = "Spanish" 
    }); 

CollectionViewSource cvs = new CollectionViewSource 
{ 
    Source = languages 
}; 

cmbLanguages.SetBinding(ItemsControl.ItemsSourceProperty, new Binding { Source = cvs }); 

あなたは便利なものを表示するために、UILanguageクラスのToStringをオーバーライドすることもできます:

public sealed class UILanguage 
{ 
    public string EnglishName { set; get; } 

    public string Culture { set; get; } 

    public string SpecCulture { set; get; } 

    public override string ToString() 
    { 
     return EnglishName; 
    } 
} 
+0

ありがとうございました!私はあなたのスニペットを使用していくつかのエラーを取得します。エラー '' local 'は宣言されていない接頭辞です。 8行目、10位。 XMLは無効です。 \t D:\ .... –

+0

私はXAMLを完成しました。 localは単にプロジェクトの名前空間のComboBoxTestのXAML名前空間宣言です。 – Clemens

+0

ありがとうございました!あなたのソリューションは私にとって完全に完璧です。それはうまく動作します! –

1

ビュー(あなたのXAMLに関連付けられているC#ファイル)のコンストラクタで、あなたが設定されている場合:

this.DataContext = new UILanguagesModel(); 

をそれからそれはバインディングと同じくらい簡単です:

<ComboBox Grid.Column="1" Height="23" HorizontalAlignment="Left" Margin="0,1,0,0" 
        Name="cmbLanguages" VerticalAlignment="Top" Width="207" 
        ItemsSource="{Binding Languages}"/> 

<ComboBox Grid.Column="1" Height="23" HorizontalAlignment="Left" Margin="0,1,0,0" 
         Name="cmbLanguages" VerticalAlignment="Top" Width="207" 
         ItemsSource="{Binding Languages}" 
         SelectedValue="{Binding Language}"/> 

EDIT:あなたはおそらく、その場合には結合がなり、あなたのLanguage財産であることをごComboBoxの選択した値をするつもりだあなたはおそらくあなたのLanguagesコレクションを宣言する必要があるとしていますObservableCollection

+0

申し訳ありませんが、私は言ったようにしましたが、コンボボックスには挿入されません。 –

+0

XAMLのコードビハインドを投稿できますか? –

+0

あなたのコードを使用しました。 –

関連する問題