读书人

WP8中ListBox的SelectionChanged事件绑

发布时间: 2013-10-27 15:21:50 作者: rapoo

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>

读书人网 >Windows Mobile

热点推荐