2009-08-17 9 views
0

Ich habe eine abstrakte UserControl, dass ich auf einen ToolTip zeigen wollen. Diese ToolTip sollte auf der Grundlage der Art des Datacontext unterscheiden, die in dem abgeleiteten Usercontrols definiert ist.Wie kann ich eine andere Quick-Info auf dem Datacontext Datatype in Wpf basierend anzuzeigen?

Gibt es eine Möglichkeit, eine andere ToolTip für jeden Typ in der Basisklasse zu definieren? Wenn nicht, wie kann ich diese QuickInfo im abgeleiteten Benutzersteuerelement festlegen?

Hier ist, wie ich dachte, ich würde gehen:

<UserControl ... 
    <UserControl.ToolTip> 
    <DataTemplate DataType="{x:Type Library:Event}"> 
     <StackPanel> 
     <TextBlock FontWeight="Bold" Text="{Binding Name}" /> 
     <TextBlock> 
      <TextBlock.Text> 
      <Binding Path="Kp" StringFormat="{}Kp: {0}m" /> 
      </TextBlock.Text> 
     </TextBlock> 
     </StackPanel> 
    </DataTemplate> 
    </UserControl.ToolTip> 
</UserControl> 

Antwort

1

Könnten Sie nicht eine benutzerdefinierte Valueconverter erstellen, die die Informationen zurückgibt Sie möchten für den Typ angezeigt werden?

Sie könnten ‚Phantasie dieses up‘ ein bisschen der Konverter zu ermöglichen, Datenvorlagen zu akzeptieren wie Sie vorschlagen, aber das wird völlig Ihr Szenario aktivieren.

Zuerst wird der Wert Konverter erstellen. Verzeihen Sie meinen schnellen Code:

public class ToolTipConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    UIElement tip = null; 

    if (value != null) 
    { 
     // Value is the data context 
     Type t = value.GetType(); 
     string fancyName = "Unknown (" + t.ToString() + ")"; 

     // Can use IsInstanceOf, strings, you name it to do this part... 
     if (t.ToString().Contains("Person")) 
     { 
      fancyName = "My custom person type"; 
     }; 


     // Could create any visual tree here for the tooltip child 
     TextBlock tb = new TextBlock 
     { 
      Text = fancyName 
     }; 
     tip = tb; 
    } 

    return tip; 
} 

public object ConvertBack(object o, Type t, object o2, CultureInfo ci) 
{ 
    return null; 
} 

}

instanziiert es dann in Ihrer Benutzerkontrolle Ressourcen (I definierte die xmlns "local" diesen Namensraum und Montag zu sein):

<UserControl.Resources> 
    <local:ToolTipConverter x:Key="toolTipConverter" /> 
</UserControl.Resources> 

Und machen sicher, dass das root-visual deines user-controls seine ToolTip-Eigenschaft bindet:

<Grid 
    ToolTip="{Binding Converter={StaticResource toolTipConverter}}" 
    Background="Blue"> 
    <!-- stuff goes here --> 
</Grid> 
+0

Danke, ich habe es vorerst geschafft, indem ich einen visuellen Baum im Code erstellt habe. Aber ich würde wirklich gerne in der Lage sein, die Vorlagen in XAML zu definieren, da diese Anwendung lokalisiert werden muss, wird es viel einfacher. Wie lässt der Konverter eine Vorlage akzeptieren? Kannst du mich auf einige Referenzlinks verweisen? –

+0

Ich schaffte es am Ende und es funktioniert perfekt, danke :-) –

0

Obwohl es ein wirklich ist Alte Post, ich werde immer noch meine Antwort posten, da ich heute das selbe Problem hatte. Im Grunde habe ich alle meine Tooltip Templates in Resoures eingefügt, wie der Autor der Frage. Damit dies wirklich funktionierte, fehlten der Tooltip-Inhalt und ein Ressourcenabschnitt. Mit diesen Methoden werden Temlate tatsächlich angewendet.

<UserControl ... 
    <UserControl.ToolTip> 
    <Tooltip Content="{Binding}"> 
     <Tooltip.Resources> 
     <DataTemplate DataType="{x:Type Type1}"> 
      ... 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type Type2}"> 
      ... 
     </DataTemplate> 
     </Tooltip.Resources> 
    </Tooltip> 
</UserControl>