我有一个ListBox,每个项目都有一个TextBlock和一个按钮。按钮有一个命令。问题是,当我点击按钮时,列表框的selecteditem并没有改变。(我猜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){
}因此,我需要在命令运行之前更改选定的项。我该怎么做呢?
发布于 2012-03-07 22:37:58
我的建议是在这里不要使用ListBox。仅当您需要实际选择一个项目时才使用ListBox。相反,考虑一个ItemsControl。
您遇到的下一个问题是传入选定的项。您可以通过将CommandParameter绑定到当前项来完成此操作,如下所示:
CommandParameter="{Binding}"然后,您需要更改Command以接受参数。对于DelegateCommand,看起来您可能正在使用棱镜(或者已经使用了您自己的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
}https://stackoverflow.com/questions/9603291
复制相似问题