2009-12-01 14 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.