首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ListBox.SelectionChanged不会触发

ListBox.SelectionChanged不会触发
EN

Stack Overflow用户
提问于 2012-03-07 22:28:40
回答 1查看 455关注 0票数 0

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

代码语言:javascript
运行
复制
<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>

视图模型的相关部分(我不认为它有任何问题):

代码语言:javascript
运行
复制
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){
}

因此,我需要在命令运行之前更改选定的项。我该怎么做呢?

EN

Stack Overflow用户

回答已采纳

发布于 2012-03-07 22:37:58

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

您遇到的下一个问题是传入选定的项。您可以通过将CommandParameter绑定到当前项来完成此操作,如下所示:

代码语言:javascript
运行
复制
CommandParameter="{Binding}"

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

代码语言:javascript
运行
复制
public RelayCommand<Products> AddToFavCommand { get; private set;}

然后,在其中设置命令:

代码语言:javascript
运行
复制
AddToFavCommand = new RelayCommand<Products>((p)=>AddToFav(p));

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

代码语言:javascript
运行
复制
AddToFavCommand = new RelayCommand<Products>(AddToFav);

代码语言:javascript
运行
复制
private void AddToFav(Products p)
{

     //do stuff
}
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9603291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档