2010-05-18 10 views

risposta

14

Il nostro approccio di successo per l'associazione di una casella combinata è la seguente ...

<ComboBox 
    ItemsSource="{Binding Path=AllItems}" 
    SelectedItem={Binding Path=CurrentItem, Mode=TwoWay} /> 
<TextBlock Text="{Binding Path=CurrentItem, Mode=TwoWay}" /> 

class public ItemListViewModel 
{ 
    public ObservableCollection<Item> AllItems {get; set;} 

    private Item _currentItem; 
    public Item CurrentItem 
    { 
     get { return _currentItem; } 
     set 
     { 
      if (_currentItem == value) return; 
      _currentItem = value; 
      RaisePropertyChanged("CurrentItem"); 
     } 
    } 
} 
+1

questo è strano. Potrei giurare che ho fatto esattamente quello che ha suggerito prima, perché ho letto su alcuni blog ... Ora ho provato di nuovo e ha funzionato: P Nel frattempo ho aiutato con questo se qualcuno è interessato XD // Imposta la nuova Schoolclass creata come indice selezionato nel controllo dell'interfaccia utente .. SelectedSchoolclassIndex = (Schoolclasses.Count! = 0)? Schoolclasses.Count - 1: 0; – msfanboy

+1

Ho appena avuto questo problema. Ho avuto 2 raccolte separate e ho dimenticato l'operatore uguale a quello in modo che il currentitem sia stato prelevato da un'altra raccolta rispetto a quella che ho associato a XAML. Quindi implementare equals ha risolto il problema. Ma la selezione dalla stessa collezione ha risolto anche il problema –

5

Non sicuro perché non è possibile associare dati a SelectedItem su un ComboBox senza visualizzare il codice. Di seguito viene illustrato come eseguire l'utilizzo di un oggetto CollectionView che ha la gestione degli articoli corrente in cui sono supportati i combobox. CollectionView ha un oggetto CurrentItem che puoi usare per ottenere attualmente selezionato.

XAML:

<Window x:Class="CBTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <ComboBox 
      ItemsSource="{Binding Path=Names}" 
      IsSynchronizedWithCurrentItem="True"> 
      <ComboBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding}" /> 
       </DataTemplate> 
      </ComboBox.ItemTemplate> 
     </ComboBox> 
     <TextBlock Text="{Binding Path=Names.CurrentItem}" /> 
    </StackPanel> 
</Window> 

codice dietro:

using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Data; 

namespace CBTest 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      DataContext = new VM(); 
     } 
    } 

    public class VM 
    { 
     public VM() 
     { 
      _namesModel.Add("Bob"); 
      _namesModel.Add("Joe"); 
      _namesModel.Add("Sally"); 
      _namesModel.Add("Lucy"); 

      Names = new CollectionView(_namesModel); 

      // Set currently selected item to Sally. 

      Names.MoveCurrentTo("Sally"); 
     } 

     public CollectionView Names { get; private set; } 

     private List<string> _namesModel = new List<string>(); 
    } 
} 
+0

" ... Non certo perché si impossibile eseguire il binding di dati a SelectedItem su un ComboBox senza visualizzare il codice .... " do a google facile è un problema molto diffuso. CollectionView è un overhead totale nel mio caso inoltre posso e non voglio kickare la mia ObservableCollection come ho bisogno per add/del cui CollectionView non ha. – msfanboy

+0

Un CollectionView può essere una vista di una ObservableCollection quindi è necessario calciare qualsiasi cosa. Cosa intendi per CollectionView come overhead totale? Stai parlando delle altre funzionalità che CollectionView fornisce accanto a Current, come il filtro, il raggruppamento e l'ordinamento? Non riesco ancora a capire quale sia il problema del binding di selecteditem su una combobox. –

+0

Non ho bisogno di un CollectionView thats it ;-) Se voglio ordinare questo è il lavoro del controllo, nel mio caso il DataGrid ha questa funzionalità. CollectionView è okish per un listview che non fa clic sull'intestazione della colonna. – msfanboy