WP8中ListBox的SelectionChanged事件绑定Command问题,求助,在线等

岁月无情_1 2013-04-08 10:54:49
我在WP8中使用MVVMLight框架 4.1.27.22645

在一个ListBox的SelectionChanged事件中绑定一个Command,在ViewModel中没有触发,在线求助。

XAML代码:
<ListBox x:Name="lstProvinces"
ItemTemplate="{StaticResource dtItemTemplate}"
ItemsSource="{Binding Provinces}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<toolkit:WrapPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command="{Binding ProvinceSelectedChangedCommand, Mode=OneWay}" CommandParameter="{Binding SelectedItem, ElementName=lstProvinces}" />
<!-- CommandParameter="{Binding SelectedItem, ElementName=lstProvinces}" -->
<!-- <i:InvokeCommandAction Command="{Binding ProvinceSelectedChangedCommand}" CommandParameter="ddd" /> -->
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>


ViewModel中的代码
        private RelayCommand<ProvinceModel> provinceSelectedChangedCommand;

/// <summary>
/// Gets the ProvinceSelectedChangedCommand.
/// </summary>
public RelayCommand<ProvinceModel> ProvinceSelectedChangedCommand
{
get
{
return provinceSelectedChangedCommand
?? (provinceSelectedChangedCommand = new RelayCommand<ProvinceModel>(
(province) =>
{
SelectedProvince = province;

//获取当前省份下的城市信息
if (province != null)
{
CitiesLevel1 = selectAddressService.GetCitiesByProvinceCode(province.ProvinceCode);
}
}));
}
}
...全文
2893 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
林晓lx 2015-11-03
  • 打赏
  • 举报
回复
@cacaca6 这个本来已经itemsource了,怎么还能绑定源之外的属性?
blue_myself88 2014-12-16
  • 打赏
  • 举报
回复
我也遇到这个问题了,我的解决方法是把这个button给改成textblock 因为listbox里面绑定的是button的时候,消息首先就被button给截获了,而不会传给listbox的selectionchanged的方法里面了。
cacaca6 2013-04-09
  • 打赏
  • 举报
回复
我帮你改一下吧,正确的做法大概是这样: 在你的ViewModel中 既然已经有了SelectedProvince Property,那么可以改动XAML <ListBox x:Name="lstProvinces" ItemTemplate="{StaticResource dtItemTemplate}" ItemsSource="{Binding Provinces}" SelectedItem="{Binding SelectedProvince, Mode=TwoWay}"> 改写SelectedProvince的Setter T SelectedProvince { get { return province; } set { province = value; if (value != null) { CitiesLevel1 = selectAddressService.GetCitiesByProvinceCode(province.ProvinceCode); } RaisePropertyChange("SelectedProvince"); } }
cacaca6 2013-04-09
  • 打赏
  • 举报
回复
Command虽然理论上可能允许这么用,但这是不被推荐使用的,就好像你本来习惯用右手刷牙,却非要用左手。 Command适合应用的的场合是继承了ButtonBase的控件,只有ButtonBase才会自动识别ICommand Interface,从而实现Command的功能
#blackheart 2013-04-09
  • 打赏
  • 举报
回复
我觉得在WINDWOS phone上用mvvm纯属给自己找不痛快。。。
Neoyee 2013-04-09
  • 打赏
  • 举报
回复
那是因为SelectionChanged只有在选择改变之后才能触发,如果你每次都点击同一个Item,那是不会触发的,建议给DataTemplate的容器添加Tap事件,这样就可以每次都触发了。
 <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="Tap">
                                    <i:InvokeCommandAction Command="{Binding Main.ProvinceSelectedChangedCommand, Source={StaticResource Locator}}" CommandParameter="{Binding }" />
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                            <TextBlock Text="{Binding Code}"></TextBlock>
                            <TextBlock Text="{Binding Name}"></TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>

7,659

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧