首页 > 解决方案 > 使用 TextBlock C# MVVM XAML 通过 ToolTip 将文本绑定到特定的 ComboBox 项

问题描述

我想将 ToolTipText 属性绑定到其自身的 ToolTip,以便它可以为每个 ComboBoxItem 显示一些文本信息。不幸的是,我在输出窗口中只得到空白的 TextBlock 和这个错误:

System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“Double”(HashCode=1076756480)上找不到“ToolTipText”属性。绑定表达式:路径=工具提示文本;DataItem='双' (HashCode=1076756480); 目标元素是'TextBlock'(名称='');目标属性是“文本”(类型“字符串”)

组合框:

<ComboBox Name="PradPojemnosciowyComboBox"
          SelectedValue="{Binding SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          ItemsSource="{Binding Path=LiniaWyComboBox, 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="ComboBox">
            <Style.Triggers>
             <Trigger Property="SelectedValue" Value="{x:Null}">
               <Setter Property="SelectedIndex" Value="{Binding LiniaWyComboBox}"/>
             </Trigger>
           </Style.Triggers>
          </Style>
         </ComboBox.Style>

        <ComboBox.ItemContainerStyle >
          <Style TargetType="ComboBoxItem">
           <EventSetter Event="MouseMove"  Handler="OnMouseHover" />
             <Setter Property="ToolTip">
               <Setter.Value>
                  <TextBlock Text="{Binding ToolTipText , RelativeSource={RelativeSource Self}}" >
                 </TextBlock>
                </Setter.Value>
                </Setter>
               </Style>
             </ComboBox.ItemContainerStyle>
   </ComboBox>

方法 - OnMouseHover:

 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])
        {
            //ToolTipTextList.Add("FirstItem");
            ToolTipText = "ONE!!!!!!!!!!!!!!";
            OnPropertyChanged("LiniaWyComboBox");
            OnPropertyChanged("ToolTipText");
        }
        else
        {
            //ToolTipTextList.Add("SecondItem");
            ToolTipText = "TWO!!!!!!!!!!!!!!";
            OnPropertyChanged("LiniaWyComboBox");
            OnPropertyChanged("ToolTipText");
        }

    }

工具提示文本:

        private string _toolTipText;
    public string ToolTipText
    {
        get { return _toolTipText; }
        set {
            if (_toolTipText!=value)
            {
                _toolTipText = value;
                OnPropertyChanged("ToolTipText");
            }
            else
            {
                _toolTipText = "";
            }
        }

   }

数据网格:

<DataGrid Style="{StaticResource AzureDataGrid}" 
Grid.Row="1" 
VerticalAlignment="Stretch" 
SelectedIndex="0" 
Name="LinieWyDatagrid"  
ItemsSource="{Binding LiniaWyComboBox, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
CanUserAddRows="False" 
CanUserDeleteRows="False" 
CanUserSortColumns="True" 
AutoGenerateColumns="False"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
SelectionChanged="LinieWyDatagrid_SelectedCellsChanged"
SelectionMode="Single">

标签: c#xamlmvvmcomboboxtooltip

解决方案


我设法解决了这个问题。不需要属性“ToolTipText”。这是编辑后的代码:

XAML 组合框:

...

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

...

OnMouseHover:

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 = "Item number one";
    }
    else
    {
     item.ToolTip = "Item number two";
     }
    }

推荐阅读