2015-07-08 5 views
-1

У меня есть ListBox, как этоListBox SelectionChanged Не розжига

<ListBox Grid.ColumnSpan="4" 
      Grid.Column="1" 
      Grid.Row="7" 
      Grid.RowSpan="2" 
      Style="{DynamicResource ProductListBoxStyle}" 
      ItemTemplate="{DynamicResource ProductItemTemplate}" 
      ItemsSource="{Binding RelatedProducts}" 
      ItemsPanel="{DynamicResource ProductListItemsPanelTemplate}" 
      SelectedItem="{Binding SelectedProduct,Mode=TwoWay}" 
      Padding="-12,0,0,0" 
      IsHitTestVisible="True" 
      ItemContainerStyle="{DynamicResource ProductListItemContainerStyle}" 
      x:Name=MyListBox > 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="SelectionChanged"> 
       <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </ListBox> 

, когда я нажимаю тот же пункт снова SelectionChanged событие не стрельбы.

Так я добавил кнопку Внутри моей DataTemplate Как это

<DataTemplate x:Key="ProductItemTemplate"> 
     <Button Command="{Binding DataContext.SelectionChangedCommand,ElementName=MyListBox}"> 
      <StackPanel Width="240"> 
       <Grid Width="Auto" 
         Height="Auto" 
         VerticalAlignment="Stretch" 
         Background="White"> 
        <Image Source="/Assets/ProductCardBg.png" 
          Width="Auto" 
          Height="Auto" /> 
        <Image Source="{Binding ThumbImage}" 
          Width="207" 
          Height="216" /> 
       </Grid> 
       <TextBlock Text="{Binding Name}" 
          Margin="0,5,0,0" 
          Style="{StaticResource SWMRegularTextBlockStyle}" 
          FontSize="{StaticResource VerySmallFontSize}" /> 
       <TextBlock Text="{Binding Description}" 
          Style="{StaticResource SWMLightTextBlockStyle}" 
          FontSize="{StaticResource SmallFontSize}" /> 
       <TextBlock Text="{Binding Price}" 
          Style="{StaticResource SWMRegularTextBlockStyle}" 
          FontSize="{StaticResource SmallFontSize}" /> 

      </StackPanel> 
     </Button> 
    </DataTemplate> 

Но моя проблема в том, когда я выбираю пункт Команда не выполняется. Мне нужно щелкнуть Outside of StackPanel, а затем выполнить только команду. Но мне нужно выполнить команду всякий раз, когда я нажимаю элемент.

Пожалуйста, помогите мне, спасибо заранее.

+0

'SelectionChanged' означает выбор * измененный *. Открытие/закрытие ListBox без изменения выбора не приведет к его запуску. Я не совсем уверен, что вы пытаетесь выполнить с помощью кнопки ... – canton7

+0

@ canton7 SelectionChanged Событие не срабатывает, когда я снова выбираю один и тот же элемент. Чтобы избавиться от этой вещи, я добавил кнопку внутри элемента Itemtemplate. Однако кнопка кнопки не выполняется, когда я нажимаю «Я», но если я нажму на углы элемента означает Выполнение команды –

ответ

0

В Моем ViewModel

private void ReatedItemSelected() 
    { 
     //After My code 
     SelectedProduct = null; 
    } 

после моего кода, если я просто установить SelectedProduct как нулевые, selectionchanged события снова розжиг и мне не нужен кнопка в My DataTemplate. SelectedProduct привязан к UI и устанавливает режим как Twoway.

1

Если я вас правильно понял вы можете достичь его с помощью MouseClick событий:

<i:Interaction.Triggers> 
      <i:EventTrigger EventName="SelectionChanged"> 
       <i:InvokeCommandAction Command="{Binding MouseClick}" CommandParameter="{Binding ElementName=MyListBox ,Path=SelectedItem}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 

и в коде позади:

void MyListBox_MyListBox(Object sender, MouseEventArgs e) 
{ 
//Your code 
} 

Если вы хотите использовать команду, а не код позади сделать что-то вроде этого:

создать класс под названием BaseCommand:

public class BaseCommand : ICommand 
     { 
      protected Func<object, bool> _canExecute; 
      protected Action<object> _execute; 

      public BaseCommand() 
      { 
      } 

      public BaseCommand(Func<object, bool> canExcecute, Action<object> execute) 
      { 
       _canExecute = canExcecute; 
       _execute = execute; 
      } 
      public bool CanExecute(object parameter) 
      { 
       return _canExecute(parameter); 


} 
     public void Execute(object parameter) 
     { 
      _execute(parameter); 
     } 
     public event EventHandler CanExecuteChanged; 
    } 

public bool CanExecute(object parameter) 
{ 
    return _canExecute(parameter); 
} 

public void Execute(object parameter) 
{ 
     _execute(parameter); 
} 

в вас ViewModel:

private BaseCommand _mouseClick; 
public BaseCommand MouseClick 
{ 
    get 
    { 
    if (null == _mouseClick) 
       { 
        _mouseClick = new BaseCommand(CanExecuteCommand, OpenDocument); 
       } 
       return _open; 
    } 
} 

private bool CanExecuteCommand(object obj) 
     { 
      return true; //for example 
     } 

public void MouseClickCommand(object o) 
{ 
//do something 
} 

Таким образом, каждый раз, когда вы будете выбрать пункт он будет активировать команду.

+1

Thankyou .. Сработало. Но я нашел простое решение. Если я установил SelectedItem как null, значит, он отлично работает, и мне не нужна кнопка в моей таблице данных. –

0

Попробуйте это,

<Button Command="{Binding DataContext.SelectionChangedCommand, RelativeSource={RelativeSource AncestorType=ListBox}}"> 

если вы изменить свой стиль кнопки будет растягиваться, где когда-либо вы внутри ListItem то кнопка событие будет срабатывать. Удалите команду взаимодействия.

0

Почему бы вам просто не позвонить команде в set части вашего имущества?

private object _SelectedProduct; 

public object SelectedProduct 
{ 
    get { return _SelectedProduct; } 
    set 
    { 
     _SelectedProduct = value; 

     //Call a method in your view model here. 
     DoSomethingUseful(); 
    } 
} 
+0

Сетчатель не вызывается при повторном выборе одного и того же элемента в списке. –

0

Почему бы вам не использовать MouseUp/вниз событий если вы хотите получить что-то, чтобы выполнить каждый раз, когда выбран пункт (или даже один и тот же элемент выбран снова) !!

Смежные вопросы