将 LongListSelector.SelectedItem 绑定到 MVVM 属性时出现问题



使用 Visual Studio 2013 和 Window Phone 8 SDK,我无法获取LongListSelectorSelectedItem 属性以正确绑定到 MVVM 属性。

这似乎与控件中存在的问题相同,该错误在包含在 SDK 中之前存在,但标记为已修复。 http://silverlight.codeplex.com/workitem/9360

是否有其他人遇到这种情况并知道修复/更新版本?

我目前正在使用代码隐藏解决方法

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

为了获取被选入 ViewModel 的项目,我总是使用 LongListSelector 扩展 - 代码可以在这里找到:https://gist.github.com/Depechie/7524630

您需要做的是将其添加到 LongListSelector 的 XAML 中:

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

视图模型上的命令将在 LongListSelector 上接收项目源的对象类型

使用 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;
    }

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

相关内容

最新更新