2012-03-07 103 views
0

我有一个ListBox,每个项目都有一个TextBlock和一个Button。按钮有一个命令。 问题是,单击按钮时列表框的selecteditem不会更改。 (我猜selectionchanged事件不会触发)。当我点击文本块时,它工作正常。我的视图模型的ListBox.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){ 
} 

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

回答

1

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

下一个问题是传递选定的项目。您可以通过CommandParameter结合当前项目这样做:

CommandParameter="{Binding}" 

然后,你需要改变你的命令接受一个参数。使用DelegateCommand,它看起来像你可能使用Prism(或已经推出了你自己的DelegateCommand),并且我不确定是否可以将它设置为接受参数。我知道,MVVM光(和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 
} 
+0

我试着解决它,而不使用MVVM Light,但我可以传递一个参数给我的DelegateCommand,正如你所建议的,它工作正常。谢谢! – 2012-03-07 14:53:54