2009-12-01 2 views
1

Y at-il des situations où le contenu d'un ContentPresenter sera un objet autre qu'un UIElement? Étant donné que le champ est déclaré comme objet plutôt que comme UIElement, il semble possible qu'il y en ait. Cependant, je ne peux penser à aucune situation où ce serait, ou même si ce serait valide.Est-il approprié de diffuser ContentPresenter.Content à UIElement?

ContentPresenter presenter = GetTemplateChild(PART_Presenter) as ContentPresenter; 
UIElement myElement = (UIElement)presenter.Content; 
myElement.SomeUIMethod(); // possible InvalidOperationException? 
+0

Vous obtiendrez une exception InvalidCastException dans la deuxième ligne, et non InvalidOperationException sur le troisième – Nir

Répondre

6

je le fais tout le temps - et toute la méthode MVVM est construit sur le contenu non UIElement, voici un exemple:

Créer une classe qui ne provient pas de UIElement, je vais L'appel est MyViewModelClass dans cet exemple.

Créer une fenêtre et ajoutez ce code

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     DataContext = new MyViewModelClass(); 
     InitializeComponent(); 
    } 
} 

Et ajouter un certain contrôle de contenu au XAML:

<Button Content="{Binding}"/> 

Maintenant, vous avez un ContentPresenter (à l'intérieur du modèle contrôle Button) avec MyViewModelClass comme Contenu.

Un autre exemple (peut-être plus fréquent) est ItemControl - nous allons jeter un ListBox par exemple, chaque ListBoxItem a une ContentPresenter qui a tout ce qui était dans la liste figurant à ItemsSource.

+0

Merci, j'ai supposé que c'était le cas – jeffora

4

Voici l'exemple le plus élémentaire, je peux penser à

<Label Content="My Label" /> 

maintenant la propriété de contenu est une chaîne qui ne dérive pas de UIElement. Donc, la réponse courte est oui, ce n'est pas seulement possible, c'est susceptible de se produire.

Questions connexes