views:

530

answers:

2

It seems nobody has yet found a way to set the comboboxitem as selected with a SelectedItem="Binding Property".

Is the solution to use a IsSelected Property in the ViewModel object within the combobox itemssource ?

+1  A: 

Not sure why you can't data bind to SelectedItem on a ComboBox without seeing your code. Below shows you how to do it using a CollectionView which has current item management built in which comboboxes supports. CollectionView has a CurrentItem get property you can use to get currently selected.

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

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>();
    }
}
Wallstreet Programmer
"...Not sure why you can't data bind to SelectedItem on a ComboBox without seeing your code...."do a easy google its a very wide spreaded problem.CollectionView is total overhead in my case furthermore I can and will not kick my ObservableCollection<T> as I need it for add/del which CollectionView not has.
msfanboy
A CollectionView can be a view of an ObservableCollection so need to kick anything. What do you mean that CollectionView is total overhead? Are you talking about the other functionality that a CollectionView provides beside Current, like filtering, grouping and sorting? I still don't know what's the problem binding selecteditem on a combobox.
Wallstreet Programmer
I do not need a CollectionView thats it ;-) If I want to sort thats the job of the control, in my case the DataGrid has this functionality. CollectionView is okish for a listview which does not sort clicking on the column header.
msfanboy
@Wallstreet dude, thx for the collectionview sample, it is usefull in another scenario :)
msfanboy
+2  A: 

Our successful approach for binding a combobox is the following...

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

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

    private Item _currentItem;
    public Item CurrentItem
    {
        get { return _currentItem; }
        set
        {
            if (_currentItem == value) return;
            _currentItem = value;
            RaisePropertyChanged("CurrentItem");
        }
    }
}
Agies
this is weird. I could swear I did exactly what you suggested before because I read about it on some blogs...Now I tried again and it worked :PIn the meantime I helped with this if someone is interested XD// Set the new created Schoolclass as selected index in the UI control..SelectedSchoolclassIndex = (Schoolclasses.Count != 0) ? Schoolclasses.Count - 1 : 0;
msfanboy