it-swarm.com.de

C # WPF Combobox Wählen Sie den ersten Eintrag aus

Schönen Tag,

Ich möchte, dass meine Combobox das erste Element darin auswählt. Ich verwende C # und WPF. Ich habe die Daten aus einem DataSet gelesen. Füllen Sie die Combobox:

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

Kombinationsfeld-XAML-Code:

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

Wenn ich es versuche:

cbGastid.SelectedIndex = 0; 

Es funktioniert nicht.

17
Roboneter

Aktualisieren Sie Ihre XAML mit diesem:

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

Versuchen Sie dies anstelle von SelectedIndex

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

oder setze es in Xaml 

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

Aktualisieren Sie Ihre XAML mit diesem Code:

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

Hoffe, es funktioniert :)

2
meghna

Versuche dies, 

entferne aus dem C # -Code die folgende Zeile:

cbGastid.ItemsSource = sitesTable.DefaultView; 

und füge folgendes hinzu:

cbGastid.DataContext = sitesTable.DefaultView
1
Jose Luis

Es funktioniert für mich, wenn ich meiner VM eine SelectedIndex-Eigenschaft mit der richtigen Bindung in der XAML-Datei hinzufüge. Dies gilt zusätzlich zu ItemSource und SelectedItem. Auf diese Weise setzt SelectedIndex den Standardwert 0 und ich habe das bekommen, was ich wollte. 

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

Und die richtige Bindung in der Xaml;

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

Das funktioniert für mich ... Angesichts einer Tabelle mit Autoren und Büchern mit einer Eins-zu-Viele-Beziehung. Die XAML sieht so aus:

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

Dann sieht mein ViewModel so aus:

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
}

Sehen Sie sich die Authors and Books-Eigenschaften der ViewModel-Klasse an. Sobald sie festgelegt sind, wird das übliche PropertyChanged-Ereignis ausgelöst und der SelectedAuthor/SelectedBook auf das erste Element gesetzt.

Hoffe das hilft.

0
James

Lassen Sie mich meine Lösung mitteilen, die nach mehreren Versuchen für mich funktioniert hat. Hier ist mein Kombinationsfeld.

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

In meinem Fall musste ich einen Befehl jedes Mal aufrufen, wenn ein neues Element in der ComboBox ausgewählt wurde oder die Elementquelle aktualisiert wurde. Das Element mit dem Index null wurde jedoch nicht ausgewählt, wenn die Elementquelle aktualisiert wurde. Also, was ich gemacht habe, fügte ich hinzu

IsSynchronizedWithCurrentItem="True"

in den Eigenschaften der comboBox hat es für mich den Trick gebracht.

Ein kleiner Code von meinem ViewModel ist unten:

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

Auf diesen Stack-Überlauf link und msdn link können Sie zur weiteren Erläuterung bezüglich IsSynchronizedWithCurrentItem = "True" verweisen.

Ich hoffe es hilft! :)

0
Sabeen

Versuche dies..

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

XAML-Code:

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