Как отобразить отдельный элемент с помощью DataTemplate в Silverlight? - PullRequest
14 голосов
/ 19 февраля 2009

Я пытаюсь отобразить один элемент (не содержащийся в коллекции) с использованием DataTemplate. Вот что у меня так далеко, что ничего не показывает. Замена ItemsControl на ListBox отображает пустой список (так что я знаю, что элемент там).

        <ItemsControl
            ItemsSource="{Binding Session}"
            ItemTemplate="{StaticResource SessionHeaderDataTemplate}"
            />

Session - это отдельный объект. Я хочу использовать DataTemplate, потому что я отображаю ту же информацию в другом месте моего приложения и хотел, чтобы стиль представления был определен как ресурс, чтобы я мог обновить его в одном месте.

Любые идеи, или я должен создать коллекцию из 1 элемента в моей модели представления и привязать к ней?

Изменить: Это то, что я в конечном итоге сделал, хотя ответ ниже также решение. Я довольно привязан к своему DataTemplates, поэтому не чувствовал себя комфортно, когда что-то подобное выталкивалось в другой файл XAML.

XAML:

        <ItemsControl
            DataContext="{Binding}"
            ItemsSource="{Binding Session_ListSource}"
            ItemTemplate="{StaticResource SessionHeaderDataTemplate}" />

ViewModel:

    private Session m_Session;
    public Session Session
    {
        get { return m_Session; }
        set
        {
            if (m_Session != value)
            {
                m_Session = value;
                OnPropertyChanged("Session");

                // Added these two lines 
                Session_ListSource.Clear();
                Session_ListSource.Add(this.Session);
            }
        }
    }

    // Added this property.
    private ObservableCollection<Session> m_Session_ListSource = new ObservableCollection<Session>();
    public ObservableCollection<Session> Session_ListSource
    {
        get { return m_Session_ListSource; }
        set
        {
            if (m_Session_ListSource != value)
            {
                m_Session_ListSource = value;
                OnPropertyChanged("Session_ListSource");
            }
        }
    }

Ответы [ 2 ]

30 голосов
/ 22 июля 2009

Придерживайтесь шаблонов данных для простых представлений без кода, вместо того, чтобы создавать другие пользовательские элементы управления. Используйте ContentControl для отображения вашего DataTemplate для одного элемента.

 <ContentControl 
      ContentTemplate="{StaticResource SessionHeaderDataTemplate}" 
      Content="{Binding Path=Session}" />
1 голос
/ 19 февраля 2009

Вам не нужно использовать ItemsControl для этого, просто создайте пользовательский элемент управления, а затем привяжите его, например,

<TestProject:myControl DataContext="{Binding Session}" />

Пользовательский элемент управления может иметь свой собственный файл xaml, поэтому он может выглядеть так, как вы хотите.

...