dkackman
dkackman

Reputation: 15579

Trouble binding LongListSelector.SelectedItem to MVVM property

Using Visual Studio 2013 and the Window Phone 8 SDK I cannot get the SelectedItem property of the LongListSelector to properly bind to an MVVM property.

It appears to be an identical issue to a bug that existed in the control prior to its inclusion in the SDK but which is marked as fixed. http://silverlight.codeplex.com/workitem/9360

Is anyone else experiencing this and know of a fix/updated version?

I am currently using a code behind workaround

    private void LongListSelector_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        LongListSelector s = sender as LongListSelector;
        var vm = DataContext as ViewModel.MainViewModel;
        Debug.Assert(vm != null);

        vm.SelectedLegislator = s.SelectedItem;   
    }

Upvotes: 0

Views: 579

Answers (2)

Thanh
Thanh

Reputation: 1

Use bahavior

public class LongListSelectedItemBehavior : Behavior<LongListSelector>
{
    public object SelectedItem
    {
        get { return (object)GetValue(SelectedItemProperty); }
        set { SetValue(SelectedItemProperty, value); }
    }

    // Using a DependencyProperty as the backing store for SelectedItem.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SelectedItemProperty =
        DependencyProperty.Register("SelectedItem", typeof(object), typeof(LongListSelectedItemBehavior), new PropertyMetadata(null));


    protected override void OnAttached()
    {
        base.OnAttached();

        if (AssociatedObject != null)
        {
            AssociatedObject.SelectionChanged += AssociatedObject_SelectionChanged;
        }
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        if (AssociatedObject != null)
        {
            AssociatedObject.SelectionChanged -= AssociatedObject_SelectionChanged;
        }
    }

    private void AssociatedObject_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        SelectedItem = AssociatedObject.SelectedItem;
    }

And XAML

    <phone:LongListSelector Margin="0,0,-22,0"
                                    ItemsSource="{Binding Items}">
                <i:Interaction.Behaviors>
                    <local:LongListSelectedItemBehavior SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
                </i:Interaction.Behaviors>
            </phone:LongListSelector>

Upvotes: 0

Depechie
Depechie

Reputation: 6142

To get the item that was selected to the ViewModel, I'm always using a LongListSelector Extension - the code can be found here: https://gist.github.com/Depechie/7524630

What you need to do is add it to the XAML of your LongListSelector:

<phone:LongListSelector x:Name="List" ext:LongListSelectorExtension.Command="{Binding *YOURVIEWMODELCOMMAND*}" />

The command on the viewmodel will receive the object type of your item source on the LongListSelector

Upvotes: 2

Related Questions