Привязка текста с помощью всплывающей подсказки к конкретному элементу ComboBox с использованием TextBlock C # MVVM XAML - PullRequest
0 голосов
/ 13 января 2019

Я хочу связать свойство ToolTipText с самой всплывающей подсказкой, чтобы оно могло отображать некоторую текстовую информацию для каждого ComboBoxItem. К сожалению, я получаю только пустой TextBlock и эту ошибку в окне вывода:

Ошибка System.Windows.Data: 40: Ошибка пути BindingExpression: Свойство 'ToolTipText' не найдено для объекта '' Double ' (HashCode = 1076756480). BindingExpression: Path = ToolTipText; DataItem = 'Double' (HashCode = 1076756480); целевой элемент - «TextBlock» (Имя = ''); Целевым свойством является «Текст» (тип «Строка»)

ComboBox:

<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");
        }

    }

ToolTipText:

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

   }

DataGrid:

<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">

1 Ответ

0 голосов
/ 15 января 2019

Мне удалось решить это. Свойство ToolTipText не требуется. Вот отредактированный код:

XAML ComboBox:

...

<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";
     }
    }
...