【问题标题】:Binding text via ToolTip to specific ComboBox Item with the use of TextBlock C# MVVM XAML使用 TextBlock C# MVVM XAML 通过 ToolTip 将文本绑定到特定的 ComboBox 项
【发布时间】:2019-01-13 18:16:26
【问题描述】:

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

System.Windows.Data 错误:40:BindingExpression 路径错误: 在“对象”“双”上找不到“工具提示文本”属性 (哈希码=1076756480)'。绑定表达式:路径=工具提示文本; 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">

【问题讨论】:

  • ToolTipText 的声明方式和位置? DataContext的价值是什么?
  • 我已经用 ToolTipText 声明更新了帖子。当我将鼠标悬停在 ComboBoxItem 上时,DataContext 的值是 .. null .. 嗯。你的意思是它的价值是什么?
  • 删除RelativeSource部分不行吗?我认为这样你尝试绑定显然不存在的 ComboBox 的 ToolTipText 属性。
  • 不幸的是不是......这就是问题所在。现在或以后存在绑定错误
  • 如果你在InitializeComponent()之后添加DataContext = this

标签: c# xaml mvvm combobox tooltip


【解决方案1】:

我已经设法解决了这个问题。不需要属性“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";
     }
    }

【讨论】:

    猜你喜欢
    • 2011-08-02
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    相关资源
    最近更新 更多