我有一个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){
}
所以我需要在运行命令之前更改所选项。我怎么能这样做?
答案 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
}