2010-05-18 3 views

Répondre

14

Notre approche réussie pour lier une zone de liste déroulante est la suivante ...

<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

c'est bizarre. Je pourrais jurer que je l'ai fait exactement ce que vous avez dit avant parce que je l'ai lu sur certains blogs ... Maintenant j'ai essayé à nouveau et cela a fonctionné: P En attendant, j'aidé avec ce si quelqu'un est intéressé XD // Définir le nouveau Schoolclass créé comme index sélectionné dans le contrôle d'interface utilisateur .. SelectedSchoolclassIndex = (Schoolclasses.Count! = 0)? Schoolclasses.Count - 1: 0; – msfanboy

+1

Juste eu ce problème. J'ai eu 2 collections séparées, et j'ai oublié l'opérateur d'égal à égal de sorte que le currentItem a été choisi d'une autre collection que celle que j'ai liée à XAML. La mise en œuvre équivaut donc à résoudre le problème. Mais la sélection de la même collection a également résolu le problème –

5

Vous ne savez pas pourquoi vous ne pouvez pas lier des données à SelectedItem sur un ComboBox sans voir votre code. Ci-dessous vous montre comment le faire en utilisant un CollectionView qui a la gestion courante d'article intégrée dans laquelle les comboboxes soutiennent. CollectionView a une propriété Get CurrentItem que vous pouvez utiliser pour être sélectionné.

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> 

code derrière:

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

» ... Je ne sais pas pourquoi vous impossible de lier des données à SelectedItem sur un ComboBox sans voir votre code .... " faire un google facile est un problème très répandu. Dans mon cas, CollectionView est un surcoût total. De plus, je peux et je ne vais pas botter mon ObservableCollection car j'en ai besoin pour ajouter/supprimer ce que CollectionView n'a pas. – msfanboy

+0

Un CollectionView peut être une vue d'une ObservableCollection, il est donc nécessaire de lancer n'importe quoi. Que voulez-vous dire que CollectionView est un surcoût total? Parlez-vous des autres fonctionnalités que CollectionView fournit avec Current, comme le filtrage, le groupement et le tri? Je ne sais toujours pas quel est le problème de liaison selecteditem sur un combobox. –

+0

Je n'ai pas besoin d'une CollectionView c'est tout ;-) Si je veux trier c'est le travail du contrôle, dans mon cas, le DataGrid a cette fonctionnalité. CollectionView est correct pour un listview qui ne triera pas en cliquant sur l'en-tête de la colonne. – msfanboy

Questions connexes