Cortlendt
Cortlendt

Reputation: 2240

Implementing 2-way binding for Combobox SelectedItem in Windows Store

I have a small problem with Combobox bindings in Windows Store app. It has to be bound to localized enumeration values (enumeration name is BackgroundTrack). I have 2 properties in view model - items list and selected item. I use Tuple<,> to hold enumeration value and its localized string representation.

Property for selected item in vm:

public Tuple<BackgroundTrack, String> SelectedBackgroundTrack
{
    get
    {
        return _selectedBackgroundTrack;
    }

    set
    {
        if (_selectedBackgroundTrack == null ||
            _selectedBackgroundTrack.Equals(value))
        {
            _selectedBackgroundTrack = value;
            _settingsService.BackgroundTrack = value.Item1;
            RaisePropertyChanged("SelectedBackgroundTrack");
        }
    }
}

Property for items list in vm:

public IEnumerable<Tuple<BackgroundTrack, String>> BackgroundTrackList { get; set; }

Combobox bindings:

            <ComboBox 
             ItemsSource="{Binding Path=BackgroundTrackList}"
             SelectedItem="{Binding Path=SelectedBackgroundTrack, Mode=TwoWay}"
             Grid.Row="10" ItemTemplate="{StaticResource DataTemplate1}"
            />
            <DataTemplate x:Key="DataTemplate1">
             <Grid>
              <TextBlock Text="{Binding Item2}"/>
             </Grid>
            </DataTemplate>

ViewModel constructor:

BackgroundTrackList = EnumUtils.GetLiterals<BackgroundTrack>();
SelectedBackgroundTrack = BackgroundTrackList.First(t => t.Item1.Equals(_settingsService.BackgroundTrack));

Problem: I'm setting selected item (from app settings) in ViewModel constructor, but this value does not show in combobox - it has nothing selected. If I select something in combobbox, the binding works correctly and sets the underlying ViewModel property. How do I correct this issue? Do I need to implement INotifyPropertyChanged or defer setting of selected item property programatically?

Upvotes: 2

Views: 1654

Answers (2)

Josh Close
Josh Close

Reputation: 23383

You need to implement IEquatable<T> on the type that is used for the item. Tuple does not.

Upvotes: 1

Rohit Vats
Rohit Vats

Reputation: 81253

You can't set both SelectedItem and SelectedValuePath at same time.

If you are using SelectedItem, remove SelectedValuePath and it will work as expected.

Upvotes: 0

Related Questions