ListBox.SelectionChanged不会触发

时间:2012-03-07 14:28:40

标签: windows-phone-7 listbox selectionchanged

我有一个ListBox,每个项目都有一个TextBlock和一个Button。 Button有一个命令。 问题是,单击按钮时列表框的选择项不会更改。 (我猜是selectionchanged事件不会触发)。当我点击文本块时,它工作正常。

<ListBox ItemsSource="{Binding FavList}" SelectedItem="{Binding SelectedFav,Mode=TwoWay}">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Grid>
                                    <TextBlock Text="{Binding Name}"/>
                                    <Button Content="+" Command="{Binding Source={StaticResource ViewModel},Path=AddToFavCommand}" Margin="120,0,0,0"/>
                                </Grid>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>

我的viewmodel的相关部分(我认为它没有任何问题):

private Products _selectedFav;
        public Products SelectedFav
        {
            get
            {
                return _selectedFav;
            }
            set
            {
                if (value != _selectedFav)
                {
                    _selectedFav = value;
                    NotifyPropertyChanged("SelectedFav");
                }
            }
        }

public DelegateCommand AddToFavCommand { get; set; }
AddToFavCommand = new DelegateCommand(addtofav);

private void addtofav(object parameter){
}

所以我需要在运行命令之前更改所选项。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

我的建议是不要在这里使用ListBox。只在需要实际选择项目时才使用ListBox。相反,请考虑ItemsControl。

您遇到的下一个问题是传递所选项目。您可以通过将CommandParameter绑定到当前项目来执行此操作:

CommandParameter="{Binding}"

然后,您需要更改Command以接受参数。使用DelegateCommand,看起来你可能正在使用Prism(或已经推出了自己的DelegateCommand),我不确定你是否可以将它设置为接受参数。我知道对于MVVM Light(和RelayCommand),它看起来像这样:

public RelayCommand<Products> AddToFavCommand { get; private set;}

然后,在那里设置命令:

AddToFavCommand = new RelayCommand<Products>((p)=>AddToFav(p));

或更简单地说,使用方法组:

AddToFavCommand = new RelayCommand<Products>(AddToFav);

private void AddToFav(Products p)
{

     //do stuff
}