Wpf - 工具提示:ItemsSource无效

时间:2017-02-02 15:34:05

标签: c# .net wpf mvvm

我在UserControl中有一个Expander,我已将工具提示设置如下

 <Expander.Header >
            <Border Background="#cccccc"  Margin="2 8 8 8" Height="52"  >
                <Border.ToolTip>
                    <ToolTip >
                        <ToolTip.Resources>
                            <Style TargetType="TextBlock">
                                <Setter Property="Foreground" Value="#cccccc"/>
                            </Style>
                        </ToolTip.Resources>
                        <Border Background="#4d4d4d" BorderThickness="0.5"  CornerRadius="5" MinWidth="200">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="200"/>
                                    <ColumnDefinition Width="180"/>
                                </Grid.ColumnDefinitions>
                                <!--#region Details -->
                                <WrapPanel Grid.Column="1"  Margin="8">
                                    ...
                                    <TextBlock Margin="4" Text="{Binding Description}"/>
                                     ...
                                 </WrapPanel>
  <!--#endregion--> 

  <!--#region Previews images-->
                                    <Border Grid.Column="0"   BorderBrush="Red" BorderThickness="0 0 0.5 0" MinHeight="200">
                                        <ItemsControl ItemTemplate="{StaticResource PanelCardToolTip}"  ItemsSource="{Binding DataContext.ListVoci,RelativeSource={RelativeSource AncestorType=Window}}"  MinWidth="120"  >
                                        <!--<ItemsControl ItemTemplate="{StaticResource PanelCardToolTip}"  ItemsSource="{Binding}"  MinWidth="120"  >-->

                                            <ItemsControl.ItemsPanel>
                                                <ItemsPanelTemplate>
                                                    <WrapPanel />
                                                </ItemsPanelTemplate>

                                            </ItemsControl.ItemsPanel>

                                        </ItemsControl>
 </Border>

                                    <!--#endregion-->
                                </Grid>
                            </Border>
                        </ToolTip>
                    </Border.ToolTip>
 </Border>
            </Expander.Header>

datatemplate如下:

   <DataTemplate x:Key="PanelCardToolTip">
        <Border Background="#4d4d4d"  BorderBrush="#cccccc" BorderThickness="0.5" Width="55">
            <StackPanel Margin="8" Orientation="Vertical">
                <TextBlock Text="Static Text" Foreground="White"></TextBlock>

                <Image Margin="2" Source="{Binding PathImgAnteprima}" Width="30"/>
                <TextBlock   FontWeight="Medium" Margin="2 4 2 2" Text="{Binding Etichetta}"/>
                <TextBlock   FontWeight="Light" Margin="2 0 2 2" Text="{Binding Descrizione}"/>
            </StackPanel>
        </Border>
        <!-- CardView -->
    </DataTemplate>

问题是ItemControl的ItemsSource不起作用(就好像ItemsSource对DataContext不可见,但它是可见的)。 具有相同ItemsSource和DataTemplate的相同ItemsControl在Tooltip和Expander内部的面板中工作正常。

非常感谢 熔点

4 个答案:

答案 0 :(得分:0)

您可以将Border元素的Tag属性绑定到窗口的DataContext,然后绑定到ToolTip的PlacementTarget的Tag属性:

<Expander.Header>
    <Border Background="#cccccc"  Margin="2 8 8 8" Height="52"
                        Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=Window}}">
        <Border.ToolTip>
            <ToolTip>
                <ToolTip.Resources>
                    <Style TargetType="TextBlock">
                        <Setter Property="Foreground" Value="#cccccc"/>
                    </Style>
                </ToolTip.Resources>
                <Border Background="#4d4d4d" BorderThickness="0.5"  CornerRadius="5" MinWidth="200">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="200"/>
                            <ColumnDefinition Width="180"/>
                        </Grid.ColumnDefinitions>

                        <Border Grid.Column="0"   BorderBrush="Red" BorderThickness="0 0 0.5 0" MinHeight="200">
                            <ItemsControl ItemTemplate="{StaticResource PanelCardToolTip}"
                                          ItemsSource="{Binding PlacementTarget.Tag.ListVoci,RelativeSource={RelativeSource AncestorType=ToolTip}}" MinWidth="120">
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <WrapPanel />
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                            </ItemsControl>
                        </Border>
                    </Grid>
                </Border>
            </ToolTip>
        </Border.ToolTip>
        <TextBlock>....</TextBlock>
    </Border>
</Expander.Header>

使用RelativeSource绑定无法在ToolTip中绑定父窗口属性的原因是ToolTip驻留在自己的可视树中。

答案 1 :(得分:0)

Text="{Binding **Description**}"等其他元素可以正常访问并且工作正常。问题仅出在不重复列表的ItemsSource上。

使用工具提示中的<ToolTip DataContext="{Binding DataContext,无法使用字段Text="{Binding **Description**}"

答案 2 :(得分:0)

  • 说明是MyModel Class的公共属性。
  • ListVoci 是MyModel类的ObservableCollection<Voci>
  • MyViewModel 是MainWindow.xaml的DataContext和嵌入式用户控件。
  • ObservableCollection ListComm<MyModel> 是ListView的商品来源

就我而言,Expander是UserControl的一部分,包含在ListView中使用的DataTemplate中

代码写在下面

<ListView 

            ItemTemplate="{StaticResource PreviewCTemplate}"  
            ItemsSource="{Binding DataContext.ListComm, RelativeSource={RelativeSource AncestorType=Window}}"  
            SelectedItem="{Binding DataContext.SelectedComm, RelativeSource={RelativeSource AncestorType=Window}}"

        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Horizontal" HorizontalAlignment="Center" />
            </ItemsPanelTemplate>

        </ListView.ItemsPanel>
    </ListView>

答案 3 :(得分:0)

[已解决] - 真正的问题是`RelativeSource = {RelativeSource AncestorType = Window}。最终解决方案如下

   <Border Grid.Column="1"   BorderBrush="#cccccc" BorderThickness="0.2 0 0 0" MinHeight="200">
   <ItemsControl  ItemTemplate="{StaticResource PanelCardToolTip}"  ItemsSource="{Binding ListVoci}"  MinWidth="120"  >
       <ItemsControl.ItemsPanel>
           <ItemsPanelTemplate>
               <WrapPanel />
           </ItemsPanelTemplate>
       </ItemsControl.ItemsPanel>
   </ItemsControl>

另一项操作是我从Expander.Header标签中写出 Itemscontrol

谢谢大家 熔点