2009-04-28 9 views
14

Używam datagrid WPF z projektu Microsoft CodePlex. Mam niestandardowe sterowanie, które chcę databind do pola z wiersza datagrid. Nie mogę dla mojego życia dowiedzieć się, jak określić etykietę na wierszu datagrid.Jak określić etykietę narzędzi dla formantu w stylu z XAML?

Najbliższym, do którego przyszedłem, jest użycie RowStyle z Seterem, aby ustawić etykietę narzędzia, ale wydaje się, że działa to tylko dla tekstu. Kiedy próbuję umieścić ControlTempalte jako wartość dla ToolTip, wyświetla wynik wywołania ToString na typie ControlTemplate.

myślę, że trzeba ustawić „Szablon” własność podpowiedzi, ale nie może wydawać się, aby dowiedzieć się, jak to zrobić ...

<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 - denerwujące co najmniej. Wydał ponad 15-20 minut temu szkodnikowi problemu ... Chciałbym wiedzieć, dlaczego tak to wygląda. – Gishu

Odpowiedz

25

Zdobione ... zajęło mi około 6 godzin ...

Z jakiegoś powodu, nie mogę ustawić wartość bezpośrednio przy użyciu Value.Setter. Jeśli jednak zdefiniuję treść etykiety narzędzia jako zasobu statycznego, a następnie ustawię ją we właściwości Style obiektu DataGrid.RowStyle, to działa.

Więc DataGrid styl wiersz wygląda następująco:

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

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

     </dg:DataGrid.RowStyle> 

I zasób jest

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

Dzięki!

+0

Dzięki, bardzo mi pomogłeś :) – ScorpiAS

0

Nie ma potrzeby, aby ControlTemplate. Jeśli chcesz StackPanel w ToolTip, wystarczy ustawić go jako:

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

Można by pomyśleć, ale to nie działa. Daje wyjątek: Nie można dodać zawartości typu "System.Windows.Controls.StackPanel" do obiektu typu "System.Object". Błąd w obiekcie "System.Windows.Controls.StackPanel" w pliku znaczników "NewsCluesWpf; component/processdictionary.xaml" Linia 31 Pozycja 31. –

+0

Właściwie działa to dla mnie dobrze, bez błędów ('WPF',' .NET4. 0'). Wielkie dzięki, Kent! – Fedor

0

Nie wiem, można to zrobić poprzez XAML.

Łatwiejszy sposób może po prostu obsłużyć zdarzenia LoadingRow. W XAML mieć coś takiego:

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

Następnie w kodzie za

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

Oczywiście trzeba będzie zmienić kod w zależności od sposobu wypełniania danych w DataGrid. Jest to również niesprawdzone =)

6

Kluczem jest użycie ToolTipService.ToolTip właściwości, zamiast etykietka - tak:

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

Pracowałem dla mnie bez problemów. +1 – heltonbiker

0

Musiałem ustawić podpowiedź dynamicznie na podstawie zawartości komórek. Używam podpowiedzi do wyświetlania tekstu przepełnienia tekstu z komórki. Poniższe powiązanie pochodzi z właściwości klasy C# o nazwie CellText. Dzięki powyższym postom za pozwolenie mi uniknięcia samodzielnego rozgryzienia całej sprawy.

<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

Też dostałem to działające z kilkoma zmianami; w zestawie incase pomaga komuś.

Mój Datadrid jest związany z listą niestandardowych obiektów, chciałem wyświetlić ciąg "Nazwa" jako kolumnę i ciąg "tekst" w etykiecie narzędzia. Sztuczka dla mnie (newbe) polegała na tym, że musiałem włączyć kolumnę tekstu i ukryć ją, aby pojawiła się w etykiecie narzędzia, tj.:

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