2016-06-13 8 views
1

Helo,Как привязать подсказки к привязке к GridView привязанным к DataTable?

Я пытаюсь добавить Tooltips к GridView привязанного к DataTable. Если я использую статический текст, всплывающая подсказка работает, поэтому я предполагаю, что ошибка должна заключаться в привязке данных.

Вот мой XAML:

<TabControl x:Name="MainTabs" ItemsSource="{Binding Path=TabModels}" DisplayMemberPath="TabCaption"> 
     <TabControl.ContentTemplate> 
      <DataTemplate> 
       <DataGrid ItemsSource="{Binding Path=TabDataTable}" AutoGenerateColumns="True" IsReadOnly="True" SelectionUnit="CellOrRowHeader" > 

        <DataGrid.Resources> 
         <Style TargetType="{x:Type DataGridColumnHeader}"> 
          <Style.Triggers> 
           <Trigger Property="IsMouseOver" Value="True"> 
            <Setter Property="ToolTip" Value="{Binding Path=ColumnDescriptions, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataTemplate}}}"/> 
           </Trigger> 
          </Style.Triggers> 
         </Style> 
        </DataGrid.Resources> 

       </DataGrid> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
    </TabControl> 

А вот мой собственный класс TabModel:

public ObservableCollection<TabModel> TabModels { get; set; }  
public class TabModel 
     { 
      public string Title { get; set; } 
      public string TabCaption { get; set; } 
      public DataTable TabDataTable { get; set; } 
      public ObservableCollection<String> ColumnDescriptions { get; set;} 
     } 

Может кто-то пожалуйста, скажите мне, как Databinding должно быть сделано правильно?

+0

на первый взгляд похоже, что проблема заключается в том, что вы пытаетесь привязать к шаблону данных, вам нужно привязать либо к элементу управления шаблоном, либо предпочтительно к данным, которые размещается в шаблоне – MikeT

+0

@Sinatr. Всплывающая подсказка не работает на все, однако, если я использую статическую строку, например Value = "Tooltip", чем она работает. – nick9999

+0

@Sinatr 'DataGridItem' и' GridItem' приводят к тому, что они не поддерживаются в WPF Error, а с 'DataGridColumn' или' DataGridRow' всплывающие подсказки по-прежнему не отображаются. – nick9999

ответ

0

Вы можете использовать IMultiValueConverter.

<DataGrid.Resources> 
    <Style TargetType="{x:Type DataGridColumnHeader}"> 
     <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="ToolTip"> 
      <Setter.Value> 
       <MultiBinding Converter="{StaticResource IndexToDescriptionConverter}"> 
        <Binding Path="Column.DisplayIndex" 
          RelativeSource="{RelativeSource Self}"/> 
        <Binding Path="DataContext.ColumnDescriptions" 
          RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}"/> 
       </MultiBinding> 
      </Setter.Value> 
      </Setter> 
     </Trigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.Resources> 
+0

Большое спасибо. Это решило мою проблему. Последний вопрос, когда я меняю вкладки из моего TabControl, вызывается «ArgumentOutOfRangeException», а индекс - -1. На данный момент я исправил его с помощью блока catch try. Но это не похоже на такое чистое решение для меня. Может быть, оператор if игнорирует -1? Есть идеи? – nick9999

+0

Вы можете обрабатывать -1 в конвертере. Возвращая пустую строку, вместо того, чтобы пытаться получить элемент по данному индексу. – Funk

+0

Еще раз спасибо за вашу помощь – nick9999

0

Просто хотел отправить свой рабочий код для тех, кто с той же проблемой:

XAML:

<Window.Resources> 
    <local:IndexToDescriptionConverter x:Key="IndexToDescriptionConverter" /> 
</Window.Resources> 
.... 
    <TabControl x:Name="MainTabs" Grid.Row="2" ItemsSource="{Binding Path=TabModels}" DisplayMemberPath="TabCaption"> 
     <TabControl.ContentTemplate> 
      <DataTemplate> 
       <DataGrid ItemsSource="{Binding Path=TabDataTable}" AutoGenerateColumns="True" IsReadOnly="True" SelectionUnit="CellOrRowHeader" > 
        <DataGrid.Resources> 
         <Style TargetType="{x:Type DataGridColumnHeader}"> 
          <Style.Triggers> 
           <Trigger Property="IsMouseOver" Value="True"> 
            <Setter Property="ToolTip"> 
             <Setter.Value> 
              <MultiBinding Converter="{StaticResource IndexToDescriptionConverter}"> 
               <Binding Path="Column.DisplayIndex" 
         RelativeSource="{RelativeSource Self}"/> 
               <Binding Path="DataContext.ColumnDescriptions" 
         RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}"/> 
              </MultiBinding> 
             </Setter.Value> 
            </Setter> 
           </Trigger> 
          </Style.Triggers> 
         </Style> 
        </DataGrid.Resources> 
       </DataGrid> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
    </TabControl> 

Мой пользовательский класс TabModel:

public class TabModel 
    { 
     public string Title { get; set; } 
     public string TabCaption { get; set; } 
     public DataTable TabDataTable { get; set; } 
     public ObservableCollection<String> ColumnDescriptions { get; set; } 
    } 

И в IMultiValueConverter:

public class IndexToDescriptionConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     int index = (int)values[0]; 
     if(index < 0) 
     { 
      return null; 
     } 
     ObservableCollection<String> ColumnDescriptions = (ObservableCollection<String>)values[1]; 
     return ColumnDescriptions.ElementAt(index); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Спасибо всем, кто не спешил и помог с этим.

Смежные вопросы