首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Windows Mobile >

WP8中ListBox的SelectionChanged事件绑定Command有关问题,

2013-10-27 
WP8中ListBox的SelectionChanged事件绑定Command问题,求助,在线等我在WP8中使用MVVMLight框架 4.1.27.2264

WP8中ListBox的SelectionChanged事件绑定Command问题,求助,在线等
我在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);
                                              }
                                          }));
            }
        }

Windows?Phone?8 ListBox command Binding MVVMLIGHT
[解决办法]
Command虽然理论上可能允许这么用,但这是不被推荐使用的,就好像你本来习惯用右手刷牙,却非要用左手。

Command适合应用的的场合是继承了ButtonBase的控件,只有ButtonBase才会自动识别ICommand Interface,从而实现Command的功能
[解决办法]
我帮你改一下吧,正确的做法大概是这样:
在你的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");
   }
}



[解决办法]
那是因为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>

热点排行