WPF Tooltip «открытое» событие привязки к viewmodel не работает - PullRequest
0 голосов
/ 12 апреля 2020

Я трачу много времени, чтобы понять, почему он не работает, он просто ДОЛЖЕН работать, но не работает ...

Давайте представим, что у меня ItemsControl, связанный с ObservableCollection. Внутри ItemsControl.ItemTemplate есть StackPanel с кнопками, текстовые блоки и т. Д. c. Я хочу привязать событие ToolTip Opened, прикрепленное к StackPanel, к моей Команде, и мне также нужен экземпляр модели.

<StackPanel.ToolTip>
  <ToolTip>
    <TextBlock Text="Example text"></TextBlock>
    <i:Interaction.Triggers>
      <i:EventTrigger EventName="Opened">
        <i:InvokeCommandAction Command="{Binding Path=DataContext.TooltipOpenCommand, ElementName=MapsControl}" CommandParameter="{Binding}"/>
      </i:EventTrigger>
    </i:Interaction.Triggers>
  </ToolTip>
</StackPanel.ToolTip>

Мой C# код:

public ICommand TooltipOpenCommand => new RelayCommand(ToolTipOpen);

public void ToolTipOpen(object obj)
{
    MessageBox.Show("Test message");
}

(RelayCommand это просто пример команды по умолчанию из inte rnet с execute и CanExecute)

Таким образом, когда я наведите курсор мыши на StackPanel, появляется всплывающая подсказка с «Примером текста», но команда не выполняется, я не могу понять почему, что я делаю не так?

Кстати, чтобы доказать, что он ДОЛЖЕН работать, проверьте этот код (он прикреплен только к той же StackPanel в примере выше, но не к всплывающей подсказке) , И ЭТОТ КОДЕКС РАБОТАЕТ !!! Но код выше не ...

<i:Interaction.Triggers>
  <i:EventTrigger EventName="MouseEnter">
    <i:InvokeCommandAction Command="{Binding Path=DataContext.TooltipOpenCommand, ElementName=MapsControl}"
                           CommandParameter="{Binding}"/>
  </i:EventTrigger>
</i:Interaction.Triggers>

1 Ответ

0 голосов
/ 12 апреля 2020

Я понятия не имею, как это можно сделать с InteractionTriggers, но знаю, как этого добиться без них. Использование простого свойства Binding.

Разметка

<StackPanel Orientation="Vertical">
    <TextBlock Margin="5" Text="{Binding Text}"/>
    <Button Margin="5" Content="Click me!">
        <Button.ToolTip>
            <ToolTip IsOpen="{Binding IsOpen}">
                <TextBlock Text="Example text"/>
            </ToolTip>
        </Button.ToolTip>
    </Button>
</StackPanel>

ViewModel

private string _text;
private bool _isOpen;
public bool IsOpen
{
    get => _isOpen;
    set
    {
        _isOpen = value;
        if (IsOpen) ToolTipOpen(IsOpen);
        OnPropertyChanged();
    }
}
public void ToolTipOpen(object obj)
{
    Text = "Tooltip isOpen: " + obj.ToString();
}
public string Text
{
    get => _text;
    set
    {
        _text = value;
        OnPropertyChanged();
    }
}

Обратите внимание, что MessageBox.Show() здесь может нарушиться ToolTip позиционирование. Кстати, вы можете попробовать это для теста.

...