web-dev-qa-db-fra.com

Combobox C # WPF sélectionner le premier élément

Bonne journée,

Je veux que ma liste déroulante sélectionne le premier élément qu'elle contient. J'utilise C # et WPF. Je lis les données d'un DataSet. Pour remplir la liste déroulante:

DataTable sitesTable = clGast.SelectAll().Tables[0];
cbGastid.ItemsSource = sitesTable.DefaultView;

Code XAML de la liste déroulante:

<ComboBox 
   Name="cbGastid" 
   ItemsSource="{Binding}" 
   DisplayMemberPath="Description" 
   SelectedItem="{Binding Path=id}"
   IsSynchronizedWithCurrentItem="True" />

Si j'essaye:

cbGastid.SelectedIndex = 0; 

Ça ne marche pas.

17
Roboneter

Mettez à jour votre XAML avec ceci:

<ComboBox 
        Name="cbGastid" 
        ItemsSource="{Binding}" 
        DisplayMemberPath="Description" 
        SelectedItem="{Binding Path=id}"
        IsSynchronizedWithCurrentItem="True"
        SelectedIndex="0" />  // Add me!
29
Brian

Essayez ceci au lieu de SelectedIndex

cbGastid.SelectedItem = sitesTable.DefaultView.[0][0]; // Assuming you have items here.

ou le mettre dans Xaml 

<ComboBox 
        Name="cbGastid" 
        ItemsSource="{Binding}" 
        DisplayMemberPath="Description" 
        SelectedItem="{Binding Path=id}"
        IsSynchronizedWithCurrentItem="True"
        SelectedIndex="0" />
5
123 456 789 0

Mettez à jour votre XAML avec ce code:

<ComboBox 
   Name="cbGastid" 
   ItemsSource="{Binding}" 
   DisplayMemberPath="Description" 
   SelectedItem="{Binding Path=id, UpdateSourceTrigger=PropertyChanged, Mode=OneWayToSource}"
   IsSynchronizedWithCurrentItem="True" />

Esperons que ça marche :)

2
meghna

Essaye ça, 

enlever de C # code la ligne suivante:

cbGastid.ItemsSource = sitesTable.DefaultView; 

et ajoutez ceci:

cbGastid.DataContext = sitesTable.DefaultView
1
Jose Luis

Cela fonctionne pour moi si j'ajoute une propriété SelectedIndex dans mon VM avec la liaison appropriée dans le xaml. Cela s'ajoute à ItemSource et à SelectedItem. Ainsi, SelectedIndex a pour valeur par défaut 0 et j'ai obtenu ce que je voulais. 

    public List<string> ItemSource { get; } = new List<string> { "Item1", "Item2", "Item3" };
    public int TheSelectedIndex { get; set; }

    string _theSelectedItem = null;
    public string TheSelectedItem
    {
        get { return this._theSelectedItem; }
        set
        {
            this._theSelectedItem = value;
            this.RaisePropertyChangedEvent("TheSelectedItem"); 
        } 
    }

Et la reliure appropriée dans le xaml;

    <ComboBox MaxHeight="25"  Margin="5,5,5,0" 
      ItemsSource="{Binding ItemSource}" 
      SelectedItem="{Binding TheSelectedItem, Mode=TwoWay}"
      SelectedIndex="{Binding TheSelectedIndex}" />
1
user6572332

Cela fonctionne pour moi ... Etant donné une table Authors and Books avec une relation un à plusieurs. Le XAML ressemble à ceci:

<ComboBox DisplayMemberPath="AuthorName" ItemsSource="{Binding Authors}" Name="ComboBoxAuthors"
              SelectedItem="{Binding SelectedAuthor}"
              IsSynchronizedWithCurrentItem="True" Grid.Row="0" Grid.Column="0"/>
<ComboBox DisplayMemberPath="BookTitle" ItemsSource="{Binding Books}" Name="ComboBoxBooks"
              SelectedItem="{Binding SelectedBook}"
              IsSynchronizedWithCurrentItem="True" Grid.Row="0" Grid.Column="1" />

Ensuite, mon ViewModel ressemble à ceci:

enter public class MainViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    BooksEntities ctx = new BooksEntities();
    List<Author> _authors;
    List<Book> _books;
    Author _selectedAuthor;
    Book _selectedBook;


    public MainViewModel()
    {
        FillAuthors();
    }

    public List<Author> Authors
    {
        get { return _authors; }
        set
        {
            _authors = value;
            NotifyPropertyChanged();
            if (_authors.Count > 0) SelectedAuthor = _authors[0]; // <--- DO THIS
        }
    }

    public Author SelectedAuthor
    {
        get { return _selectedAuthor; }
        set
        {
            _selectedAuthor = value;
            FillBooks();
            NotifyPropertyChanged();
        }
    }

    public List<Book> Books
    {
        get { return _books; }
        set
        {
            _books = value;
            NotifyPropertyChanged();
            if (_books.Count > 0) SelectedBook = _books[0]; // <--- DO THIS
        }
    }

    public Book SelectedBook
    {
        get { return _selectedBook; }
        set
        {
            _selectedBook = value;
            NotifyPropertyChanged();
        }
    }

    #region Private Functions

    private void FillAuthors()
    {
        var q = (from a in ctx.Authors select a).ToList();
        this.Authors = q;
    }

    private void FillBooks()
    {
        Author author = this.SelectedAuthor;

        var q = (from b in ctx.Books
                 orderby b.BookTitle
                 where b.AuthorId == author.Id
                 select b).ToList();
        this.Books = q;
    }

    #endregion
}

Examinez les propriétés Authors et Books de la classe ViewModel. Une fois définis, l'événement PropertyChanged habituel est déclenché et SelectedAuthor/SelectedBook est défini sur le premier élément.

J'espère que cela t'aides.

0
James

Permettez-moi de partager ma solution, cela a fonctionné pour moi après plusieurs essais, Voici ma liste déroulante,

        <ComboBox   
                Name="fruitComboBox"
                ItemsSource="{Binding Fruits}"
                SelectedIndex="0"
                SelectedValue="{Binding ComboSelectedValue}"
                IsSynchronizedWithCurrentItem="True">

        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <i:InvokeCommandAction Command="{Binding displayFruitName}"         
                                       CommandParameter="{Binding SelectedValue, ElementName=fruitComboBox}"/>
            </i:EventTrigger>
            <i:EventTrigger EventName="Loaded">
                <i:InvokeCommandAction Command="{Binding displayFruitName}"         
                                       CommandParameter="{Binding SelectedValue, ElementName=fruitComboBox}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers> 

        </ComboBox>

Dans mon cas, je devais appeler une commande à chaque fois qu'un nouvel élément est sélectionné dans la liste déroulante ou que l'item sources est mis à jour, mais l'élément à zéro index n'était pas sélectionné lorsque la source de l'élément est mise à jour. Donc, ce que j'ai fait, j'ai ajouté

IsSynchronizedWithCurrentItem="True"

dans les propriétés comboBox, il a fait l'affaire pour moi.

Un petit code de mon ViewModel est ci-dessous:

    /// item source for comboBox
    private List<string> fruits = new List<string>();
    public List<string> Fruits
    {
        get { return fruits; }
        set 
        {
            fruits = value;
            OnPropertyChanged();
            ComboSelectedValue = value[0];
        }
    }

    // property to which SelectedValue property of comboxBox is bound.
    private string comboselectedValue;
    public string ComboSelectedValue
    {
        get { return comboselectedValue; }
        set 
        { 
            comboselectedValue = value;
            OnPropertyChanged();
        }
    }

Vous pouvez vous référer à ce dépassement de pile link et msdn link pour plus de précisions concernant IsSynchronizedWithCurrentItem = "True".

J'espère que ça aide! :)

0
Sabeen

Essaye ça..

    int selectedIndex = 0;
    cbGastid.SelectedItem = cbGastid.Items.GetItemAt(selectedIndex);

Code XAML:

    <ComboBox 
        Name="cbGastid" 
        ItemsSource="{Binding}" 
        DisplayMemberPath="Description" 
        SelectedItem="{Binding Path=id}"
        IsSynchronizedWithCurrentItem="True" />
0
Ravi Patel