2014-02-13 3 views
0

Ниже приведен код для окна с кнопкой.ListBox SelectionChanged не получает вызов

У меня есть два вопроса здесь:

1) SelectionChanged не стреляющих для меня, чтобы получить выбранный элемент и его значение.

2) Ящик списка для выбора нескольких элементов, поэтому, когда я выбираю один элемент, фон не устанавливается на кнопку.

Как решить эти проблемы?

<ListBox Name="listBox" 
     HorizontalContentAlignment="Stretch" 
     VerticalContentAlignment="Stretch" 
     SelectionChanged="TopicListboxSelectionChanged" 
     ScrollViewer.VerticalScrollBarVisibility="Disabled"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Button Name="AnswerCell" 
        Width="456" 
        Content="{Binding Path=Value}" 
        Background="#FFF2F4F7" 
        Foreground="Black" 
        Style="{StaticResource CellStyle}"> 
       <Button.ContentTemplate> 
        <DataTemplate> 
         <TextBlock 
            Style="{StaticResource TextStyle}" 
            Padding="0,20,0,20" 
            TextAlignment="Center" 
            Text="{Binding}"/> 
        </DataTemplate> 
       </Button.ContentTemplate> 
      </Button> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox>   

EDIT

Вот мой текстовый блок с границей

<ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Name="AnswerCellBack" Margin="0,0,0,4" Orientation="Horizontal"> 
          <Border Name="borderColor" Background="#FFF2F4F7"> 
           <TextBlock Name="Answertext" 
             Width="456" 
             Padding="10,20,10,20" 
             TextAlignment="Center" 
             Text="{Binding Path=AnswerValue}" 
             Style="{StaticResource AnswerTextStyle}"/> 
          </Border> 
         </StackPanel> 
</DataTemplate> 
       </ListBox.ItemTemplate> 

проблема здесь:

1) Как изменить цвет элемента выбора фона, я поставил фон Пограничного в XAML.

2) Как добавить выбор нескольких элементов.

+0

Есть ли вообще не стрельба или только на * секунду * попытка? Вместо этого используйте 'Tap' :) –

+0

@ToniPetrina его не стреляет вообще – Goofy

+0

@ToniPetrina вы можете показать мне пример? пожалуйста, см. мое редактирование, а также – Goofy

ответ

2

Я считаю, что ваша проблема - это ваш DataTemplate, который состоит из кнопки. Кнопка будет нормально обрабатывать событие маршрутизируемого mouseclick и не даст функции Listbox функционировать, чтобы действовать на нее, поэтому вы не получаете событие выбора.

Попробуйте изменить элемент кнопки на границу, например, и посмотрите, будет ли тогда ваше событие?

Он также может не быть плохой идеей использовать вложенное свойство и связать изменение выбора к команде,

public class SelectionChangeCommand : DependencyObject 
    { 
     public static bool GetIsRegistered(DependencyObject obj) 
     { 
      return (bool)obj.GetValue(IsRegisteredProperty); 
     } 

    public static void SetIsRegistered(DependencyObject obj, bool value) 
    { 
     obj.SetValue(IsRegisteredProperty, value); 
    } 

    // Using a DependencyProperty as the backing store for IsRegistered. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty IsRegisteredProperty = 
     DependencyProperty.RegisterAttached("IsRegistered", typeof(bool), typeof(SelectionChangeCommand), new PropertyMetadata(false, new PropertyChangedCallback(RegisterForCommand))); 

    private static void RegisterForCommand(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     if (d is Selector) 
     { 
      Selector sel = (Selector)d; 
      if ((bool)e.NewValue) 
      { 
       sel.SelectionChanged += sel_SelectionChanged; 
      } 
      else 
      { 
       sel.SelectionChanged -= sel_SelectionChanged; 
      } 
     } 
    } 

    static void sel_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (sender is Selector) 
     { 
      Selector sel = (Selector)sender; 
      ICommand command = GetCommand(sel); 

      if (command!=null && command.CanExecute(null)) 
       command.Execute(sel); 
     } 
    } 

    public static ICommand GetCommand(DependencyObject obj) 
    { 
     return (ICommand)obj.GetValue(CommandProperty); 
    } 

    public static void SetCommand(DependencyObject obj, ICommand value) 
    { 
     obj.SetValue(CommandProperty, value); 
    } 

    // Using a DependencyProperty as the backing store for Command. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty CommandProperty = 
     DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(SelectionChangeCommand), new PropertyMetadata(null)); 
} 

после ссылки на Xmlns вы можете использовать код в XAML следующим образом:

<ListBox kernelAttached:SelectionChangeCommand.Command="{Binding SelectedLinkCommand}" 
kernelAttached:SelectionChangeCommand.IsRegistered="True" > 
+0

ok, проверит это и сообщит вам, пожалуйста, подождите – Goofy

+0

Да, я пробовал использовать только границу, а мое событие смены изменений - firing.please см. мое редактирование – Goofy

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