2012-03-07 105 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