Подсказка, заданная по стилю, не работает

Всплывающая подсказка для нижеприведенного списка настраивается с помощью установщика. При наведении курсора мыши всплывающая подсказка не появляется.

Я подозреваю, что проблема в самом источнике элементов списка. Список привязан к списку AttributeItems, который называется CandidateAttributes. Элементом этого списка является наблюдаемая коллекция с именем AttributePath, а свойство в пути атрибута, к которому я пытаюсь привязать всплывающую подсказку, называется ConceptualPath. Ниже приводится определение CandidateAttributes-

 public static List<AttributeItem> CoBRRaAttributes { get; set; }

Класс AttributeItems -

public class AttributeItem 
{
    private string _displayName = "";
            private ObservableCollection<CoBRRa_WPF.CoBRRaUtilities.ViewModels.QueryTool.AttributeCollection> _AttributePath;


    public AttributeItem(int id, string displayName, ObservableCollection<CoBRRa_WPF.CoBRRaUtilities.ViewModels.QueryTool.AttributeCollection> attributePath)
    {
        DisplayName = displayName;
        AttributePath = attributePath;

    }

    public ObservableCollection<CoBRRa_WPF.CoBRRaUtilities.ViewModels.QueryTool.AttributeCollection> AttributePath
    {
        get
        {
            return _AttributePath;
        }
        set
        {
            _AttributePath = value;
        }
    }
  }

Xmal-

            <ListBox 
            Name="lstCandidates" 
            ItemsSource="{Binding Path=UIProperties.CandidateAttributes}"
            >
            <ListBox.ItemTemplate>            
                <DataTemplate>
                    <TextBlock Text="{Binding Path=DisplayName}">
                    </TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Setter Property="Control.ToolTip" Value="{Binding AttributePath.ConceptualPath}"/>
                </Style>
            </ListBox.ItemContainerStyle>
        </ListBox>

Я могу заменить какой-нибудь текст вместо Binding AttributePath.ConceptualPath, и всплывающая подсказка отобразит этот текст. Просто не могу понять, почему не работает в привязке. Как я могу заставить это работать?

AttributePath - это коллекция. К какому элементу в этой коллекции вы хотите применить привязку? Их может быть несколько.

mm8 10.08.2018 16:12

ConceptualPath - это то, к чему я хочу привязаться. Предполагалось, что строка «Binding AttributePath.ConceptualPath» будет заполнять всплывающую подсказку, поскольку ConceptualPath является свойством коллекции AttributePath. Я забыл включить фрагмент из лекции CoBRRa_WPF.CoBRRaUtilities.ViewModels.QueryTool.AttributeCol‌. Буду обновлять.

Chris 10.08.2018 16:22

Нет, attributePath возвращает ObservableCollection, а у него нет свойства ConceptualPath. AttributePath - это коллекция из AttributeCollections.

mm8 10.08.2018 16:23
3
3
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы привязываетесь к AttributePath.ConceptualPath, но AttributePath возвращает ObservableCollection<AttributeCollection>, а этот не имеет свойства ConceptualPath.

Вам следует либо изменить тип свойства AttributePath на просто CoBRRa_WPF.CoBRRaUtilities.ViewModels.QueryTool.AttributeCollection, либо привязать к конкретному AttributeCollection, например к первому:

<Setter Property="Control.ToolTip" Value="{Binding AttributePath[0].ConceptualPath}"/>

Также убедитесь, что ConceptualPath является общедоступным свойством класса AttributeCollection.

Редактировать:

Если вы хотите отобразить список путей во всплывающей подсказке, вам следует использовать ItemsControl:

<Style TargetType="{x:Type ListBoxItem}">
    <Setter Property="Control.ToolTip">
        <Setter.Value>
            <ItemsControl ItemsSource="{Binding AttributePath}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding ConceptualPath}" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Setter.Value>
    </Setter>
</Style>

В этом есть смысл. Пробовал AttributePath [0] .ConceptualPath, но не работал.

Chris 10.08.2018 16:38

Я подтвердил, что ConceptualPath является общедоступным свойством класса AttributeCollection.

Chris 10.08.2018 16:40

Так заполнена ли коллекция AttributePath? Вы отлаживали, чтобы узнать?

mm8 10.08.2018 16:42

Он заселен. Фактически, я заставил это частично работать, поместив это в стиль, а затем указав ItemsSource элемента ItemsControl как AttributePath. У этого подхода были свои проблемы, но всплывающая подсказка была заполнена.

Chris 10.08.2018 16:44

Что возвращает UIProperties.CandidateAttributes? Сообщите MCVE о своей проблеме: stackoverflow.com/help/mcve

mm8 10.08.2018 16:46

<Style TargetType = "ListBoxItem"> <Setter Property = "ToolTip"> <Setter.Value> <ItemsControl ItemsSource = "{Binding AttributePath}"> <ItemsControl.ItemTemplate> <DataTemplate> <TextBlock Name = "xTooltip" Grid.Column = "0" Text = "{Binding ConceptualPath}">

Chris 10.08.2018 16:46

Вышеупомянутое сработало, но не удалось избавиться от пустых всплывающих подсказок в пользовательском интерфейсе.

Chris 10.08.2018 16:47

UIProperties.CandidateAttributes - это свойство, которое возвращает CobbraAttributes в получателе.

Chris 10.08.2018 16:49

Ждать! Используя AttributePath [0] .ConceptualPath DID, я получил первый элемент в списке. Он не показывает весь список, только первый элемент. Как я могу изменить это, чтобы привязать его к списку, а не только к первому элементу этого списка

Chris 10.08.2018 16:55

Да, конечно, он показывает только первый элемент. Если вы хотите отобразить ConceptualPath всех элементов в коллекции, вы должны использовать ItemsControl.

mm8 10.08.2018 16:55

Вы в моем рождественском списке !! Это сработало. Огромное спасибо!

Chris 10.08.2018 17:02

Другие вопросы по теме