2012-03-07 10 views
0

私はListBoxを持っています。各項目にはTextBlockとButtonがあります。ボタンにはコマンドがあります。 問題は、リストボックスのselecteditemがボタンをクリックしても変更されないということです。 (私はselectionchangedイベントが発生しないと思う)。テキストブロックをクリックするとうまくいきます。私のviewmodelの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をロールしたようです)。パラメータを受け入れるように設定できるかどうかはわかりません。あなたのコマンドを設定する場合は、その後、

public RelayCommand<Products> AddToFavCommand { get; private set;} 

:私はMVVMライト(およびRelayCommand)のために、それはこのようになっていることを知っている

AddToFavCommand = new RelayCommand<Products>((p)=>AddToFav(p)); 

または、より簡単に、メソッド・グループを使用して:

AddToFavCommand = new RelayCommand<Products>(AddToFav); 

private void AddToFav(Products p) 
{ 

    //do stuff 
} 
+0

私がしようMVVM Lightを使わなくても解決できますが、私が提案したようにDelegateCommandにパラメータを渡すことができ、正常に動作します。ありがとう! –

関連する問題