c# - 显示 ComboBoxItem 的工具提示 - 移动鼠标后有效,但不是第一次尝试

标签 c# wpf mvvm combobox

我正在使用 WPF 组合框,组合框中只有两个项目。我通过将 item.Content 与一个类包含的属性进行比较来显示每个 ComboboxItem 的工具提示,如下所示:

private void OnMouseHover(object sender, MouseEventArgs e)
{
    var lineSelected = (modelGPZ.GetLineWyList().FirstOrDefault(x => x.isSelected == true));
    ComboBoxItem item = sender as ComboBoxItem;
    if ((double)item.Content == lineSelected.LiniaWyComboBox[0])
    {
        item.ToolTip = "This is the first Item";
    }
    if((double)item.Content == lineSelected.LiniaWyComboBox[1])
    {
        item.ToolTip = "This is the second Item";
    }
}

问题是,当我第一次打开 Combobox 时,我没有得到工具提示...很奇怪,因为在我调试它时会调用该方法。更奇怪的是,当我将鼠标悬停在一个项目上,然后悬停在另一个项目上,最后悬停在第一个项目上时……我的工具提示出现了……

我尝试将事件更改为 MouseEnter,它甚至不调用方法以及我认为此类操作的其他相关事件。 MSDN ComboBox Class

用于调用 mentiod 方法的 XAML:

<ComboBox.ItemContainerStyle >
    <Style TargetType="{x:Type ComboBoxItem}">
        <EventSetter Event="MouseMove"  Handler="OnMouseHover"/>
    </Style>
</ComboBox.ItemContainerStyle>

MouseMoveMouseLeave 的工作方式如前所述。对于 GotFocus,问题是 isEditable=True - 不幸的是,焦点停留在 TextBlock 上。

MainWindows.xaml 中的组合框:

<DataGridTemplateColumn Header="PRĄD POJEMNOŚCIOWY [A]" HeaderStyle="{StaticResource PRAD_POJEMNOSCIOWY}">
 <DataGridTemplateColumn.CellTemplate>
   <DataTemplate>
    <ComboBox x:Name="PradPojemnosciowyComboBox"
              ItemsSource="{Binding LiniaWyComboBox, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
              SelectedItem="{Binding SelectedItemComboBox, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
              IsEditable="True"
              IsReadOnly="False"
              Text="{Binding Prad_pojemnosciowy, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
              IsTextSearchEnabled="False"
              IsSynchronizedWithCurrentItem="True"
              PreviewKeyDown="PradPojemnosciowyComboBox_OnPreviewKeyDown">
    <ComboBox.Style>
    <Style TargetType="{x:Type ComboBox}">
      <Style.Triggers>
        <Trigger Property="SelectedValue" Value="{x:Null}">
         <Setter Property="SelectedItem" Value="{Binding SelectedItemComboBox, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
        </Trigger>
      </Style.Triggers>
     </Style>
    </ComboBox.Style>

     <ComboBox.ItemContainerStyle >
      <Style TargetType="{x:Type ComboBoxItem}">
       <EventSetter Event="GotFocus"  Handler="PradPojemnosciowyComboBox_GotFocus"/>
      </Style>
     </ComboBox.ItemContainerStyle>
   </ComboBox>
  </DataTemplate>
 </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

最佳答案

这种行为在逻辑上是恕我直言。首先你没有 ComboBoxItemToolTip,第一次 MouseMove ToolTip 被设置,但是已经太晚了触发它 ToolTip(对于 ComboBoxItem 而言,ToolTip 似乎比 MouseMove 更早触发)。因此您只能在第二次输入该项目时看到 ToolTip

将所有内容附加到 GotFocus,它将按预期工作:

<ComboBox.ItemContainerStyle >
    <Style TargetType="{x:Type ComboBoxItem}">
        <EventSetter Event="GotFocus"  Handler="ComboBoxItem_GotFocus"/>
    </Style>
</ComboBox.ItemContainerStyle>

private void ComboBoxItem_GotFocus(object sender, RoutedEventArgs e)
{
    var lineSelected = (modelGPZ.GetLineWyList().FirstOrDefault(x => x.isSelected == true));
    ComboBoxItem item = sender as ComboBoxItem;
    if ((double)item.Content == lineSelected.LiniaWyComboBox[0])
    {
        item.ToolTip = "This is the first Item";
    }
    if ((double)item.Content == lineSelected.LiniaWyComboBox[1])
    {
        item.ToolTip = "This is the second Item";
    }
}

更好的方法是在 ViewModel 对象中创建一个属性 ItemToolTip,它是 ComboBoxItem 的 DataContext 并绑定(bind)它:

<ComboBox.ItemContainerStyle >
    <Style TargetType="{x:Type ComboBoxItem}">
        <Setter Property="ToolTip">
            <Setter.Value>
                <ToolTip Content="{Binding ItemToolTip}"/>
            </Setter.Value>
        </Setter>
    </Style>
</ComboBox.ItemContainerStyle>

示例如何在 ViewModel 中准备数据:

public List<object> CbxItemsSource { get; set; } = InitCbxSource();
private static List<object> InitCbxSource()
{
    var dblLst = new List<double>() { 1, 2, 3 };
    return dblLst.Select(dbl => (object)new { ItemValue = dbl, ItemToolTip = "e.g. item index " + dblLst.IndexOf(dbl)}).ToList();
}

关于c# - 显示 ComboBoxItem 的工具提示 - 移动鼠标后有效,但不是第一次尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54588156/

相关文章:

c# - 如何在 c# gui 中调用我的 c++ 程序?

.net - 如果抛出异常的对象是在事件处理程序中创建的,则全局事件处理程序没有详细信息

c# - 将 WPF Datagrid 列设置为 Combobox itemssource

c# - 从 ObservableCollection<CProject> 对象获取字符串属性

wpf - 如何使用 MVVMLight 初始化我的 WPF 应用程序?

c# - 如何使用异步方法对 ViewModel 进行单元测试。

c# - 如何使用 selenium webdriver 将鼠标悬停在不执行任何鼠标单击的情况下查看隐藏菜单?

c# - Silverlight MVVM 实现不显示内容

c# - 在 ASP .NET Core 中自动递增版本号

c# - 使用 MVVM C#​​ 将 UpdateSourceTrigger 设置为 WPF ListBox 项源控件的显式