点击手势事件+ Longlistselector + Groupheader点击

时间:2013-12-13 11:33:35

标签: c# xaml windows-phone-8 mvvm-light longlistselector

我正在努力解决一个问题:我有一个像这样的LonglistSelector:

 <phone:LongListSelector Name="ListContacts" 
                                           ItemsSource="{Binding GroupedPeople}"
                                           JumpListStyle="{StaticResource LongListSelectorJumpListStyle}"                                             
                                           GroupHeaderTemplate="{StaticResource LongListSelectorGroupHeaderTemmplate}"
                                           ItemTemplate="{StaticResource LongListSelectorItemTemplate}"
                                           HideEmptyGroups ="True" IsGroupingEnabled ="true" LayoutMode="List">
                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="Tap">
                                    <mvvmlight:EventToCommand Command="{Binding ListContactsTapCommand, Mode=OneTime}" CommandParameter="{Binding ElementName=ListContacts, Path=SelectedItem}" />

                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </phone:LongListSelector>

这与此链接中的PeopleHub非常相似:http://code.msdn.microsoft.com/wpapps/PeopleHub-Windows-Phone-80-88abe94d

我的问题在于点击事件。当我第一次点击一封信时,一切都按预期发生。然后,我点击一个联系人以查看更多信息,这一切都很好。

当我再次单击该字母时会出现问题,因为tap事件被触发两次(我认为):一个因为SelectedItem不为null而另一个则显示该字母。

在我的ViewModel中,我有这个:

 public RelayCommand<Contact> ListContactsTapCommand { get; private set; }

.....

 this.ListContactsTapCommand = new RelayCommand<Contact>(contact => ShowContactInformation(contact), contact => contact != null);

 private void ShowContactInformation(Contact c)
        {

            ServiceLocator.Current.GetInstance<ContactInfoViewModel>().ContactInfo = c;
            _navigationService.NavigateTo(new Uri(ViewModelLocator.ContactInfoPage, UriKind.Relative));

        }

我认为可能解决方案是重置SelectedItem,或者然后知道我在哪里挖掘。

任何人都可以伸出援手吗? 提前谢谢。

此致

1 个答案:

答案 0 :(得分:0)

以一种我不完全同意的方式解决了我的问题...并且它“打破”mvvm模式一点

这就是我所做的

查看:

<mvvmlight:EventToCommand Command="{Binding ListContactsTapCommand, Mode=OneTime}" CommandParameter="{Binding ElementName=ListContacts}"/>

视图模型:

 this.ListContactsTapCommand = new RelayCommand<LongListSelector>(param => ShowContactInformation(param), param => param.SelectedItem != null);
 private void ShowContactInformation(LongListSelector c)
        {

            ServiceLocator.Current.GetInstance<ContactInfoViewModel>().ContactInfo = c.SelectedItem as Contact;
            _navigationService.NavigateTo(new Uri(ViewModelLocator.ContactInfoPage, UriKind.Relative));
            c.SelectedItem = null;

        }

我不同意这种方法的原因是因为ViewModel必须知道来自视图的对象......这是不可能的,但由于LonglistSelector不允许Binding到SelectedItem,这是我带来的解决方案。

如果你们有任何其他观点......我会很高兴知道它:)

提前再次感谢。