2009-12-01 5 views
1

Есть ли ситуации, когда содержание ContentPresenter будет каким-то объектом, кроме UIElement? Учитывая, что поле объявлено как объект, а не UIElement, кажется возможным, что это будет. Однако я не могу думать о каких-либо ситуациях, где это было бы, или даже если бы это было бы справедливо.Уместно ли распространять ContentPresenter.Content для UIElement?

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

Вы получите InvalidCastException во второй строке, а не и InvalidOperationException на третьем – Nir

ответ

6

я делаю это все время - и весь метод MVVM построен на не- UIElement содержания, вот пример:

Создать класс, который не является производным от UIElement, я буду вызов - это MyViewModelClass в этом примере.

Создать окно и добавить этот код

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

И добавить некоторый контроль контента в XAML:

<Button Content="{Binding}"/> 

Теперь у вас есть ContentPresenter (внутри элемента управления Button шаблона) с MyViewModelClass, что и Содержание.

Другой (возможно чаще) пример ItemControl - давайте ListBox, например, каждый ListBoxItem имеет ContentPresenter что все, что было в списке, установленным в ItemsSource.

+0

Спасибо, я предположил, что это так – jeffora

4

Вот самый простой пример, я могу думать о

<Label Content="My Label" /> 

Теперь свойство контента является строка, которая не вытекает из UIElement. Итак, короткий ответ - да, это не только возможно, это, скорее всего, произойдет.