Почему мне нужно дважды щелкнуть элемент списка WPF, чтобы запустить команду? - PullRequest
1 голос
/ 27 мая 2010

Я пытаюсь сделать так, чтобы стандартный список WPF динамически заполнялся, и для каждого элемента в списке запускалась команда при нажатии. В настоящее время у меня есть рабочий список, который можно заполнить, и каждый элемент будет запускать правильную команду, но для запуска команды мне нужно дважды щелкнуть элемент списка. то есть, нажмите один раз, чтобы выбрать элемент, затем нажмите на фактический текст, чтобы запустить команду.

Поскольку список создается динамически, мне пришлось создать шаблон данных для элементов списка:

<ListBox.ItemTemplate>
      <DataTemplate>
        <TextBlock Margin="4,2,4,2">
          <Hyperlink TextDecorations="None" Command="MyCommands:CommandsRegistry.OpenPanel">
            <TextBlock Text="{Binding}" Margin="4,2,4,2"/>
          </Hyperlink>
        </TextBlock>
      </DataTemplate>
 </ListBox.ItemTemplate>

В принципе, как убрать необходимость дважды щелкать? Я пытался использовать триггеры событий для запуска события click для элемента гиперссылки, когда выбран элемент списка, но я не могу заставить его работать. Или есть ли лучший подход для динамического заполнения списка и добавления команд к каждому элементу списка?

Спасибо

1 Ответ

1 голос
/ 27 мая 2010

Вы определенно нажимаете на сам текст гиперссылки? Я без труда запустил ваш код, и первое нажатие на ссылку сработало для меня.

Обновление: если вашей команде нужно знать, какой элемент списка был нажат, вы всегда можете добавить CommandParameter:

<Hyperlink TextDecorations="None" Command="my:CommandsRegistry.OpenPanel" CommandParameter="{Binding}">

затем в вашем методе execute (поскольку ваш ListBox связан со списком строк):

public void Execute(object parameter)
{
    MessageBox.Show("You clicked on " + parameter.ToString());
}

Обновление 2: Для автоматического выбора элементов вы можете передать ListBoxItem в качестве параметра CommandParameter:

<Hyperlink TextDecorations="None" Command="my:CommandsRegistry.OpenPanel" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}">

и затем выберите его в своей команде:

public void Execute(object parameter)
{
    ListBoxItem itemClicked = (ListBoxItem)parameter;
    itemClicked.IsSelected = true;
    MessageBox.Show("You clicked on " + parameter.ToString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...