Уместно ли привести ContentPresenter.Content к UIElement? - PullRequest
1 голос
/ 01 декабря 2009

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

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

Ответы [ 2 ]

6 голосов
/ 01 декабря 2009

Я делаю это все время - и весь метод 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.

4 голосов
/ 01 декабря 2009

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

<Label Content="My Label" />

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

...