2009-04-28 26 views
14

Tôi đang sử dụng bảng dữ liệu WPF từ dự án Microsoft CodePlex. Tôi có một điều khiển tùy chỉnh mà tôi muốn databind đến một trường từ hàng của DataGrid. Tôi không thể cho cuộc sống của tôi tìm ra cách chỉ định một chú giải công cụ trên hàng dữ liệu.Làm thế nào để chỉ định một ToolTip cho một điều khiển trong một Style từ XAML?

Gần nhất tôi đến là sử dụng một RowStyle với một Setter để đặt chú giải công cụ, nhưng điều này dường như chỉ hoạt động đối với văn bản. Khi tôi cố gắng đặt một ControlTempalte vào làm Giá trị cho ToolTip, nó sẽ hiển thị kết quả của việc gọi ToString trên kiểu ControlTemplate.

Tôi nghĩ rằng tôi cần phải thiết lập các "mẫu" của tài ToolTip, nhưng tôi dường như không thể tìm ra cách để làm điều đó ...

<dg:DataGrid Name="dgResults" AutoGenerateColumns="True"> 

      <dg:DataGrid.RowStyle > 


      <Style TargetType="{x:Type dg:DataGridRow}"> 

       <Setter Property="ToolTip" > 
        <Setter.Value> 

         <ControlTemplate TargetType="{x:Type ToolTip}"> 
          <StackPanel> 
           <TextBlock>txt1</TextBlock><TextBlock>txt2</TextBlock> 
          </StackPanel> 
         </ControlTemplate> 


        </Setter.Value> 
       </Setter> 
      </Style> 

     </dg:DataGrid.RowStyle> 

    </dg:DataGrid> 
+0

@Sean - gây phiền nhiễu khi nói ít nhất. Đã dành hơn 15-20 phút với dịch hại này ... Tôi rất muốn biết tại sao lại như vậy .. – Gishu

Trả lời

25

đặn nó ra ... Tôi mất khoảng 6 tiếng đồng hồ ...

Đối với một số lý do, tôi không thể thiết lập giá trị trực tiếp sử dụng Value.Setter. Nếu tôi xác định nội dung cho chú giải công cụ dưới dạng tài nguyên tĩnh, và sau đó đặt nó trong thuộc tính Kiểu của DataGrid.RowStyle nó hoạt động.

Vì vậy, phong cách hàng DataGrid trông giống như:

  <Style TargetType="{x:Type dg:DataGridRow}"> 

       <Setter Property="ToolTip" Value="{StaticResource resKWIC}"> 
       </Setter>     
      </Style> 

     </dg:DataGrid.RowStyle> 

Và tài nguyên là

<Window.Resources> 
    <StackPanel x:Key="resKWIC"> 
     <TextBlock>f1</TextBlock> 
     <TextBlock>f2></TextBlock> 
    </StackPanel> 
</Window.Resources> 

Cảm ơn!

+0

Cảm ơn, bạn đã giúp tôi rất nhiều :) – ScorpiAS

0

Không cần cho ControlTemplate. Nếu bạn muốn StackPanel trong ToolTip, chỉ cần đặt nó như:

<Setter Property="ToolTip"> 
    <Setter.Value> 
     <StackPanel> 
      <TextBlock>txt1</TextBlock><TextBlock>txt2</TextBlock> 
     </StackPanel> 
    </Setter.Value> 
</Setter> 
+10

Bạn sẽ nghĩ như vậy, nhưng điều này không hiệu quả. Cung cấp ngoại lệ: Không thể thêm nội dung thuộc loại 'System.Windows.Controls.StackPanel' vào đối tượng thuộc loại 'System.Object'. Lỗi tại đối tượng 'System.Windows.Controls.StackPanel' trong tệp đánh dấu 'NewsCluesWpf; component/processdictionary.xaml' Dòng 31 Vị trí 31. –

+0

Thực ra, nó hoạt động tốt cho tôi, không có lỗi ('WPF',' .NET4. 0'). Cảm ơn rất nhiều, Kent! – Fedor

0

Không chắc bạn có thể làm điều đó thông qua XAML.

Một cách dễ dàng hơn có thể là chỉ xử lý sự kiện LoadingRow. Trong XAML có cái gì đó như:

<dg:DataGrid Name="dgResults" AutoGenerateColumns="True" 
      LoadingRow="dgResults_LoadingRow" 
      ItemsSource="{Binding ListOfStrings}" /> 

Sau đó trong mã đằng sau

void dgResults_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    DataGridRow row = e.Row; 
    row.ToolTip = row.DataContext as string; 
} 

Rõ ràng bạn sẽ phải thay đổi mã tùy thuộc vào cách bạn đang Populating các dữ liệu trong datagrid. Đây là cũng chưa được kiểm tra =)

6

Điều quan trọng là sử dụng ToolTipService.ToolTip tài sản, thay vì ToolTip - như thế này:

<Setter Property="ToolTipService.ToolTip" Value="My Tooltip"/> 
+0

Làm việc cho tôi mà không phiền phức. +1 – heltonbiker

0

tôi cần phải thiết lập các tooltip động dựa trên nội dung di động. Tôi đang sử dụng chú giải công cụ để hiển thị văn bản tràn văn bản từ ô. Các ràng buộc dưới đây là từ một thuộc tính lớp C# tên là CellText. Nhờ các bài viết ở trên cho phép tôi tránh tìm ra toàn bộ điều mình.

<DataGridTextColumn Header="HeaderText" Binding="{Binding DisplayText, Mode=OneWay}" Width="33*"> 
          <DataGridTextColumn.CellStyle> 
           <Style> 
            <Setter Property="ToolTipService.ToolTip" Value="{Binding DisplayText, Mode=OneWay}"/> 
           </Style> 
          </DataGridTextColumn.CellStyle> 
         </DataGridTextColumn> 
1

Tôi cũng làm việc này với một vài thay đổi; bao gồm trong trường hợp nó giúp một ai đó.

My Datadrid bị ràng buộc vào danh sách các đối tượng tùy chỉnh, tôi muốn hiển thị chuỗi "Tên" dưới dạng cột và chuỗi "văn bản" trong chú giải công cụ. Bí quyết đối với tôi (newbe) là tôi phải bao gồm cột văn bản và ẩn nó để nó hiển thị trong chú giải công cụ, tức là:

<DataGrid AutoGenerateColumns="False" CanUserAddRows="False" EnableRowVirtualization="False" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" IsReadOnly="True" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}" Name="dgrTextGroupText" VerticalContentAlignment="Stretch" Grid.Column="3" Grid.Row="1" Grid.RowSpan="6" CanUserReorderColumns="False" CanUserSortColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Name}" Width="*" /> 
     <DataGridTextColumn Binding="{Binding Text}" Width="0" Visibility="Hidden" /> 
    </DataGrid.Columns> 
    <DataGrid.RowStyle> 
     <Style TargetType="{x:Type DataGridRow}"> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=DataContext.text}" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.RowStyle> 
</DataGrid> 
Các vấn đề liên quan