c# - 使用 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">
解决方案
我设法解决了这个问题。不需要属性“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";
}
}
推荐阅读
- sql - 如何压缩返回的具有多个角色的用户行
- logstash - Logstash - csv 内的嵌套 json
- architecture - YOLOv5:基本架构 - 在哪里可以找到?
- wordpress - 如何从 Gatsby WordPress 网站的页面内容查询中排除作者和日期
- php - mysqli 和 php 在中添加列
- web-scraping - 通过在实际数据中添加无用数据来妨碍网站解析
- postgresql - Postgresql/rails - 加入不同的值,或者只为不同的值创建重复的行
- r - 如何在闪亮的应用程序中指定 kable 表的尺寸?
- python - 如何在单个应用程序运行期间使用 os.remove 删除多个文件
- mips - 堆栈中的 MIPS 函数和变量