2012-02-15 52 views
0

我想將控件數據源設置爲可觀察的鍵值對集合,但僅顯示對的關鍵部分。正確設置WPF控件中的綁定

我有第三方多選組合框。

我修改了附帶的數據源類,以便它包含關鍵值對集合。

這裏是類:

public class DataSource : INotifyPropertyChanged 
    { 
     private ObservableCollection<KeyValuePair<string,string>> _items; 

     public DataSource(ObservableCollection<KeyValuePair<string, string>> items) 
     { 
      _items = items; 
     } 

     #region INotifyPropertyChanged Members 

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

     #endregion 




     public ObservableCollection<KeyValuePair<string, string>> Items 
     { 
      get { return _items; } 
     } 

     private string _selectedItem = ""; 
     public string SelectedItem 
     { 
      get { return _selectedItem; } 
      set 
      { 
       _selectedItem = value; 
       OnPropertyChanged("SelectedItem"); 
      } 
     } 

     private ObservableCollection<KeyValuePair<string, string>> _selectedItems; 
     public ObservableCollection<KeyValuePair<string, string>> SelectedItems 
     { 
      get 
      { 
       if (_selectedItems == null) 
       { 
        _selectedItems = new ObservableCollection<KeyValuePair<string, string>> { new KeyValuePair<string,string>("ALL"," ") }; 
        SelectedItemsText = WriteSelectedItemsString(_selectedItems); 
        _selectedItems.CollectionChanged += 
         (s, e) => 
         { 
          SelectedItemsText = WriteSelectedItemsString(_selectedItems); 
          OnPropertyChanged("SelectedItems"); 
         }; 
       } 
       return _selectedItems; 
      } 
      set 
      { 
       _selectedItems = value; 
      } 
     } 

     public string SelectedItemsText 
     { 
      get { return _selectedItemsText; } 
      set 
      { 
       _selectedItemsText = value; 
       OnPropertyChanged("SelectedItemsText"); 
      } 
     } string _selectedItemsText; 


     private static string WriteSelectedItemsString(IList<KeyValuePair<string, string>> list) 
     { 
      if (list.Count == 0) 
       return String.Empty; 

      StringBuilder builder = new StringBuilder(list[0].Key); 

      for (int i = 1; i < list.Count; i++) 
      { 
       builder.Append(", "); 
       builder.Append(list[i]. 
); 
      } 

      return builder.ToString(); 
     } 
    } 

在後面的代碼我有:

DataSource ds = new DataSource(materialNames); 
      cmbLastEditors.DataContext = ds; 

而在我的XAML中我有:

<my1:MultiComboBox Name="cmbLastEditors" Grid.Row="8" Grid.Column="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" SelectionMode="Multiple" DisplaySeparator=", " ItemsSource="{Binding Items}" SelectedItems="{Binding SelectedItems}" /> 

我想要做這樣的事情

ItemsSource="{Binding Items.Key}" 

任何人都可以幫助我嗎?如果您需要更多信息,請告訴我。

回答

3

對於常規組合框,您有ValueMemberDisplayMember字段。 這與DisplayMemberPath類似。見this鏈接,一個更好的解釋,但你的組合框應該是這樣的:

<my1:MultiComboBox Name="cmbLastEditors" 
        Grid.Row="8" Grid.Column="1" 
        VerticalAlignment="Stretch" HorizontalAlignment="Stretch" 
        SelectionMode="Multiple" DisplaySeparator=", " 
        ItemsSource="{Binding Items}" 
        SelectedItems="{Binding SelectedItems}" 
        DisplayMemberPath="Key" /> 

當然,我不知道這是否與您的第三方組合框。

如果這樣做不起作用,您可以在Combobox的ItemTemplate中使用值轉換器。例如,將轉換器添加到ItemTemplate中的文本塊,您可以在其中綁定整個對象並使用轉換器返回要顯示的鍵值。

class MyKeyValueConverter : IValueConverter 
{ 
    public object Convert(object aValue) 
    { 
     var pair = aValue as KeyValuePair<string, string>; 
     return pair.Key; 
    } 
} 


<TextBlock Text="{Binding Path=., Converter={StaticResource myKeyValueConverter}}"/> 
+0

輝煌。非常感謝:D添加DisplayMemberPath =「鑰匙」工作。 – user589195 2012-02-15 16:55:59

4

您可以使用ItemTemplate來呈現列表中的每個項目。像這樣:

<my1:MultiComboBox ...> 
    <my1:MultiComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Key}"/> 
     </DataTemplate> 
    <my1:MultiComboBox.ItemTemplate> 
</my1:MultiComboBox> 

也就是說,假設您的自定義MultiComboBox支持正常的WPF ItemTemplate語義。

+0

+1 Actualy比我的想法更好,因爲我認爲DataTemplate已被使用。有時我覺得比必要更復雜:) – dowhilefor 2012-02-15 16:31:20

+0

其實,我忘記了ValueMember/DisplayMember。如果自定義控件支持該功能,則更容易。 +1周圍:) – 2012-02-15 16:34:05