0

我有一个 ListBox,每个项目都有一个 TextBlock 和一个 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>

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

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){
}

所以我需要在命令运行之前更改所选项目。我怎样才能做到这一点?

4

1 回答 1

1

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

您遇到的下一个问题是传入所选项目。您可以通过将 CommandParameter 绑定到当前项目来做到这一点,如下所示:

CommandParameter="{Binding}"

然后,您将需要更改您的命令以接受参数。使用 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
}
于 2012-03-07T14:37:57.557 回答