Правильная настройка привязки в элементе управления WPF - PullRequest
0 голосов
/ 15 февраля 2012

Я хочу установить источник данных управления для наблюдаемой коллекции пар ключ-значение, но только для отображения ключевой части пары.

У меня есть сторонний комбинированный список с несколькими выборками.

Я изменил класс источника данных, который прилагается к нему, чтобы он содержал коллекции пар «ключ-значение».

Вот класс:

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}"

Может ли кто-нибудь мне помочь?Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Ответы [ 2 ]

4 голосов
/ 15 февраля 2012

Вы можете сделать это, используя ItemTemplate для рендеринга каждого элемента в списке. Примерно так:

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

То есть при условии, что ваш пользовательский MultiComboBox поддерживает нормальную семантику WPF ItemTemplate.

3 голосов
/ 15 февраля 2012

Для обычных комбинированных списков у вас есть поля ValueMember и DisplayMember. Который работает аналогично DisplayMemberPath. См. эту ссылку для лучшего объяснения, но ваш ComboBox должен выглядеть следующим образом:

<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" />

Конечно, я не уверен, что это работает с вашим сторонним списком.

Если это не сработает, вы можете использовать преобразователь значений в ItemTemplate в Combobox. Например, добавьте конвертер в текстовый блок в шаблоне 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}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...