c# wpf xaml combobox dataset

C#WPF Combobox seleccionar primer elemento



xaml dataset (8)

Actualiza tu XAML con esto:

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

Buen día,

Quiero que mi combobox seleccione el primer elemento en él. Estoy usando C # y WPF. Leí los datos de un DataSet. Para llenar el combobox:

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

Cuadro combinado de código XAML:

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

Si lo intento

cbGastid.SelectedIndex = 0;

No funciona


Actualiza tu XAML con este código:

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

Espero que funcione :)


Esto me funciona ... Dada una tabla de autores y libros con una relación de uno a varios. El XAML se ve así:

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

Entonces mi ViewModel se ve así:

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 }

Eche un vistazo a las propiedades de autores y libros de la clase ViewModel. Una vez que se configuran, se genera el evento PropertyChanged habitual y el SelectedAuthor / SelectedBook se establece en el primer elemento.

Espero que esto ayude.


Funciona para mí si agrego una propiedad SelectedIndex en mi VM con el enlace adecuado en el xaml. Esto es además de ItemSource y SelectedItem. De esta manera, SelectedIndex por defecto es 0 y obtuve lo que quería.

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

Y la encuadernación adecuada en el xaml;

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


Permítame compartir mi solución, que funcionó para mí después de varias pruebas, aquí está mi cuadro combinado,

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

En mi caso, tuve que invocar un comando cada vez que se seleccionó un nuevo elemento en el comboBox o se actualizó el itemource, pero el elemento en el índice cero no se seleccionó cuando se actualizó el origen del elemento. Entonces, lo que hice, agregué

IsSynchronizedWithCurrentItem="True"

en las propiedades de comboBox, hizo el truco para mí.

Un pequeño código de mi ViewModel está abajo:

/// 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(); } }

Puede consultar este link desbordamiento de pila y el link msdn para obtener más información sobre IsSynchronizedWithCurrentItem = "True"

¡Espero eso ayude! :)


Prueba esto,

eliminar del código de C # la siguiente línea:

cbGastid.ItemsSource = sitesTable.DefaultView;

y añade esto:

cbGastid.DataContext = sitesTable.DefaultView


Prueba esto, en lugar de SelectedIndex

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

o ponlo en Xaml

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


Prueba esto..

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

Código XAML:

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