DataContext родительского

Я новичок WPF. Мне нужно добиться следующего: у меня есть ModelView, который содержит коллекцию Observable класса "Edata". Edata также содержит другое ObservableColelction класса "eParams", которое содержит 4 свойства.

теперь у меня есть список, который содержит список Edata, и другой список, который содержит параметры. Все работает отлично. проблема заключается в подсказке. Я в свойстве класса Edata под названием AsStringToolTip. Я использую это свойство, чтобы дать некоторую подсказку пользователю и краткую информацию о строке, где находится мышь.

<ListBox x:Name="lbx1" Grid.Column="0" Grid.Row="1" ItemsSource="{Binding EData}" VerticalAlignment="Center" HorizontalAlignment="Center">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel VirtualizingPanel.VirtualizationMode="Recycling"/>
            </ItemsPanelTemplate>

        </ListBox.ItemsPanel>

        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Style="{StaticResource Description}" TextWrapping="Wrap">
                    <TextBlock.Text>
                        <MultiBinding StringFormat="{}{0} , {1}">
                            <Binding Path="Edata.category" />
                            <Binding Path="Edata.EId" />

                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
            </DataTemplate>
        </ListBox.ItemTemplate>

    </ListBox>



    <!-- No Compar ListView -->
    <ListView Grid.Column="1" Grid.Row="1" ItemsSource="{Binding SelectedItem.Edata.eparams ,ElementName=lbx1}" Grid.IsSharedSizeScope="True"  >
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel VirtualizingPanel.VirtualizationMode="Recycling"/>
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
        <ListView.View>
            <GridView  >

                <GridViewColumn Header="Name"  >
                    <GridViewColumn.CellTemplate>
                        <DataTemplate >
                            <StackPanel Orientation="Horizontal" >
                                <TextBlock Text="{Binding Name}">
                                    <TextBlock.ToolTip>
                                        **<TextBlock DataContext="{Binding SelectedValue,ElementName=lbx1}" Text="{Binding Path=AsStringToolTip}">**

                                        </TextBlock>
                                    </TextBlock.ToolTip>

                                    </TextBlock>



                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

                <GridViewColumn Header="ValueString" >
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" >
                                <TextBlock  Text="{Binding ValueString}" />


                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="value" >
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock  Text="{Binding value}" />

                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

                <GridViewColumn Header="paramtype">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock  Text="{Binding paramtype}" />


                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

            </GridView>
        </ListView.View>
    </ListView>

Я надеюсь, что я достаточно ясно. Любой совет. В данный момент подсказка ничего не показывает!!!

1 ответ

Так как подсказка находится в своем собственном визуальном дереве, она не может найти ListBox при оценке привязки.

Но вы можете привязать свойство Tag TextBlock к ListBox, а затем привязать элемент во всплывающей подсказке к PlacementTarget самой всплывающей подсказки. Это, вероятно, лучше объяснить с помощью некоторой разметки:

<GridViewColumn Header="Name"  >
    <GridViewColumn.CellTemplate>
        <DataTemplate >
            <StackPanel Orientation="Horizontal" >
                <TextBlock Text="Name" Tag="{Binding ElementName=lbx1}">
                    <TextBlock.ToolTip>
                        <ToolTip>
                            <TextBlock Text="{Binding PlacementTarget.Tag.SelectedItem.AsStringToolTip, 
                                                    RelativeSource={RelativeSource AncestorType=ToolTip}}" />
                        </ToolTip>
                    </TextBlock.ToolTip>
                                    </TextBlock>
            </StackPanel>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

PlacementTarget в пути привязки ссылается на текстовый блок "Имя". Свойство Tag этого TextBlock возвращает ссылку на ListBox "lbx1". Затем вы можете получить свойство AsStringToolTip выбранного в данный момент объекта Edata.

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