2013-10-10 2 views
0

У меня есть программа, в которой я меняю коллекцию элементов, отображаемых в comboBox. Я говорил об этом раньше в this question. Во всяком случае, я использую пользовательскую коллекцию прямо сейчас, потому что observableCollection не имеет свойства selectedItem. У пользовательской коллекции есть свойство selectedItem, но я просто не знаю, как ее установить, чтобы данные были сохранены.Как использовать выбранный элемент в пользовательской коллекции

Пользовательские коллекции Class

public class MyCustomCollection<T>: ObservableCollection<T> 
{ 
    private T _mySelectedItem; 

    public MyCustomCollection(IEnumerable<T> collection) : base(collection) { } 

    public T MySelectedItem 
    { 
     get { return _mySelectedItem; } 
     set 
     { 
      if (Equals(value, _mySelectedItem)) return; 
      _mySelectedItem = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("MySelectedItem")); 
     } 
    } 
} 

ViewModel - Где я могу изменить коллекцию в comboBox и установите selectedItem для каждой коллекции

//Property for the selected command in the LIST BOX 
//**For clarity: the collection in the comboBox is changed based on what is 
//selected in the list box 
public string SelectedCommand 
{ 
    get { return _selectedCommand; } 
    set 
    { 
     _selectedCommand = value; 
     NotifyPropertyChange(() => SelectedCommand); 

     if (SelectedCommand == "1st Collection of type A") 
     { 
      ComboBoxEnabled = true; 
      ComboBoxList = new MyCustomCollection<string>(collectionA); 
      //collectionA.MySelectedItem = ??(What would I put here?) 
     } 
     if (SelectedCommand == "2nd Collection of type A") 
     { 
      ComboBoxEnabled = true; 
      ComboBoxList = new MyCustomCollection<string>(collectionA); 
      //collectionA.MySelectedItem = ??(What would I put here?) 
     } 
    } 
} 

Как бы присвоить значение MySelectedItem для каждой новой коллекции, которую я создаю и добавляю к comboBox? Это сделает так, что всякий раз, когда я переключаюсь на другую коллекцию в comboBox, будет отображаться selectedItem.

UPDATE

Мои коллекции теперь установлены в качестве ObservableCollection<string>.

XAML для ListBox и ComboBox

<ListBox ItemsSource="{Binding Model.CommandList}" SelectedItem="{Binding Model.SelectedCommand}" ... /> 

<ComboBox ItemsSource="{Binding Model.ComboBoxList}" SelectedItem="{Binding Model.SelectedOperation}" ... /> 

** Новый SelectedCommand недвижимость под ListBox:

public string SelectedCommand 
{ 
    get { return _selectedCommand; } 
    set 
    { 
     _selectedCommand = value; 
     NotifyPropertyChange(() => SelectedCommand); 

     switch (SelectedCommand) 
     { 
      case "Collection A": 
       { 
        ComboBoxList = CollectionA; 
        break; 
       } 
      case "Collection B": 
       { 
        ComboBoxList = CollectionB; 
        break; 
       } 
     } 
     NotifyPropertyChange(() => ComboBoxList); 
    } 
} 

Программа по-прежнему не держит selectedItem, который выбран для каждой коллекции. Должно быть, я забыл или не понял чего-то.

+0

Не уверен, что я понимаю, почему вы решили реализовать пользовательский 'ObservableCollection'. Вы можете привязать свой 'ComboBox' к коллекции, а также к выбранному элементу' ' –

+0

Я знаю это, и это работает. Но коллекция 'comboBox' и' selectedItem' зависят от того, какая команда выбрана в 'listBox'. Таким образом, 'selectedItem' не зависит от одного набора для каждого окна, которое оно существует. –

+0

Итак, позвольте мне понять, что вы хотите «ComboBox», когда вы меняете его коллекцию (я предполагаю, выбирая какой-то элемент в списке), это 'SelectedItem' становится ... что? –

ответ

0

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

<StackPanel> 
     <!-- your listbox --> 
     <ListBox x:Name="listbox"> 
      <sys:String>Fruits</sys:String> 
      <sys:String>Vegetables</sys:String> 
      <sys:String>Others</sys:String> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="SelectionChanged"> 
        <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding ElementName=listbox, Path=SelectedItem}"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </ListBox> 

     <!-- your combo box --> 
     <ComboBox ItemsSource="{Binding Items}" SelectedItem="{Binding CurrentItem}"/> 
    </StackPanel> 

XAML содержит ListBox с элементами (в данном примере, простые строки) и команду SelectionChangedCommand, вызывающие всякий раз, когда выбор в списке получает изменился.

вот ViewModel

public class MainWindowViewModel : NotificationObject 
{ 
    // your collections 
    private ObservableCollection<string> fruits; 
    private ObservableCollection<string> vegetables; 
    private ObservableCollection<string> others; 

    public MainWindowViewModel() 
    { 
     fruits = new ObservableCollection<string> 
      { 
       "Apple", "Banana" 
      }; 
     vegetables = new ObservableCollection<string> 
      { 
       "Tomato", "Cabbage" 
      }; 
     others = new ObservableCollection<string> 
      { 
       "Pizza", "Steak" 
      }; 

     SelectionChangedCommand = new DelegateCommand<string>(item => 
      { 
       // When user selects item in the listbox change the collection of your comboBox 
       switch (item) 
       { 
        case "Fruits": 
         { 
          Items = fruits; 
          break; 
         } 
        case "Vegetables": 
         { 
          Items = vegetables; 
          break; 
         } 
        case "Others": 
         { 
          Items = others; 
          break; 
         } 
       } 

       // Raise property change to make combobox update 
       RaisePropertyChanged(() => Items); 
      });    
    } 

    // the collection currently displayed in the comboBox 
    public ObservableCollection<string> Items { get; set; } 

    // The selected item of the combobox 
    public string CurrentItem { get; set; } 

    public DelegateCommand<string> SelectionChangedCommand { get; set; } 
} 

ViewModel содержит:

  1. Несколько коллекций, как частные члены (фрукты, овощей и других)

  2. Items который является свойством коллекции, представляющим текущие элементы ComboBox на основе выбора в ListBox`.

  3. CurrentItem имущество, связанное с SelectedItem от ComboBox.

  4. , который при вызове изменяет коллекцию на основе заданного параметра (выбранный элемент в ListBox).

Обратите внимание, что в этом примере используется Prism рамки, но вы можете добиться этого с любым MVVM framework, который поддерживает команду.

Если вы не используете какую-либо фреймворк, просто обработайте код в «Команде» как код, который будет выполняться всякий раз, когда элемент выбора ListBox будет изменен (однако вы реализовали это).

Надеюсь, это поможет

+1

Вы должны использовать какой-то фреймворк, потому что я просто использую C# -> WPF. Я не получаю 'Interaction' в моем xaml. –

+0

так называемый 'SelectionChangedCommand' заставляет меня запутаться, это фактически« обработчик событий », называемый« SelectionChangedEventHandler ». –

+0

@Ericafterdark Да. Извините, что не упоминал об этом. Я использую структуру [Prism] (http://compositewpf.codeplex.com/). если вы не используете какую-либо фреймворк (что вам должно быть кстати), просто поместите код команды в ваш установщик 'SelectedCommand', который, как я полагаю, вызывается, когда пользователь меняет selecteItem ListBox. –

Смежные вопросы