2013-05-11 98 views
0

我正在做这个小程序,只是为了学习如何将一些对象的数据绑定到组合框。我想要做的是在文本块中显示组合框中某些单词的翻译。在组合框中,我想要英文单词,例如在文本块西班牙语中。Combobox WPF list

对于我创建XAML中称为cmbBox1组合框和文本块称为TB1

然后,我创建的类 “词”:

​​

和列表的三个词:

private void Window_Loaded_1(object sender, RoutedEventArgs e) 
    { 
     // Creation of a list of objects of class "word" 
     List<word> mydictionary = new List<word>(); 

     word word1 = new word(); 
     word1.english = "Hello"; 
     word1.spanish = "Hola"; 

     word word2 = new word(); 
     word2.english = "Goodbye"; 
     word2.spanish = "Adios"; 

     word word3 = new word(); 
     word3.english = "How are you?"; 
     word3.spanish = "¿Qué tal?"; 

     mydictionary.Add(word1); 
     mydictionary.Add(word2); 
     mydictionary.Add(word3); 

     //Adding the objects of the list mydictionary to combobox <--- 
     foreach (word myword in mydictionary) 
     { 
      cmbBox1.Items.Add(myword); 
     } 



    } 

和INT XAML我已经为我的组合框:

<ComboBox x:Name="cmbBox1" HorizontalAlignment="Left" Margin="133,122,0,0" VerticalAlignment="Top" Width="120" 
        ItemsSource="{Binding Path=word}" 
        DisplayMemberPath="english" 
        SelectedValuePath="english" 
       SelectedValue="{Binding Path=word}" /> 

我希望在组合框中显示属性“english”,并在文本块中显示属性“spanish”。如果用户在组合框中单击一个单词时会执行一个不同的方法,例如MessageBox.Show(“您选择了单词”+ word1.english“),这将会很不错。

所有这些的目的是学习如何做更复杂的事情:我将加载一些带有一些数据通道的文本文件,每个通道都会有一堆特性,我希望能够选择通道然后绘制它。非常感谢你。

回答

2

我认为你应该开始学习C#和WPF一步一步。试图绑定到类而不是绑定到实例或集合不是理解WPF的问题。

但是我知道有几个人在WPF中理解数据绑定的大问题,所以我会拿起你的帖子来描述这个简单的例子。

1)不要手动添加项目(cmbBox1.Items.Add(myword);) - 这就是数据绑定的目的。

2)你不能绑定到一个类型(如Binding Path=word)。你必须绑定到一个objet /集合。对象/集合必须是属性,而不是像您的实现mydictionary这样的本地集合。

public List<Word> MyDictionary {get; set;} 
public Word SelectedWord {get; set;} 

ItemsSource="{Binding Path=MyDictionary}" 
SelectedItem="{Binding SelectedWord}" 

3)必须设置包含数据集合的DataContext的对象,你的情况:

DataContext = this; 

4)反应来选择的变化,处理SelectionChanged事件:

<ComboBox [...] SelectionChanged="cmbBox1_SelectionChanged" /> 

完全WPF:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded"> 
<Grid> 
    <ComboBox x:Name="cmbBox1" HorizontalAlignment="Left" Margin="133,122,0,0" 
       VerticalAlignment="Top" Width="120" 
       ItemsSource="{Binding MyDictionary}" 
       DisplayMemberPath="english" 
       SelectedValuePath="english" 
       SelectedItem="{Binding SelectedWord}" 
       SelectionChanged="cmbBox1_SelectionChanged" /> 
</Grid> 
</Window> 

Full C#:

public class Word 
{ 
    public string english { get; set; } 
    public string spanish { get; set; } 
} 

public partial class MainWindow : Window 
{ 
    public List<Word> MyDictionary {get; set;} 

    public Word SelectedWord {get; set;} 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     MyDictionary = new List<Word>(); 

     Word word1 = new Word(); 
     word1.english = "Hello"; 
     word1.spanish = "Hola"; 

     Word word2 = new Word(); 
     word2.english = "Goodbye"; 
     word2.spanish = "Adios"; 

     Word word3 = new Word(); 
     word3.english = "How are you?"; 
     word3.spanish = "¿Qué tal?"; 

     MyDictionary.Add(word1); 
     MyDictionary.Add(word2); 
     MyDictionary.Add(word3); 

     DataContext = this; 
    } 

    private void cmbBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     MessageBox.Show("You have selected the word \"" + SelectedWord.spanish + "\""); 
    } 
} 
+0

非常感谢。你帮了我很多。 – Sturm 2013-05-11 12:29:47