Search code examples
c#wpfstaticresource

msdn Data Templating Overview


I'm following msdn data templating overview http://msdn.microsoft.com/en-us/library/ms742521.aspx

But I felt they missed explaining something..for resources they have:

 <Window.Resources><local:Tasks x:Key="myTodoList"/></Window.Resources>

And all they have in XAML is

<ListBox Width="400" Margin="10"
         ItemsSource="{Binding Source={StaticResource myTodoList}}"/>

Without showing how C# code behind, they were able to show a list of items in the ListBox. The ListBox has no x:Name and I can't add the items in MainWindow, and with a separate class Tasks, I did the following (which doesn't work)

using System.Collections; // use ArrayList
using System.Collections.ObjectModel; // use Observable Collection

namespace FooApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
    public class Tasks : ObservableCollection<Tasks>
    {
        string TaskName;
        string Description;
        int Priority;

        public TasksStuff(string taskName, string description, int priority)
        {
            this.taskName = TaskName;
            this.description = Description;
            this.priority = Priority;
        }

        public string TaskName
        {get{return this.taskName}}

        public string Description
        {get{return this.description}}

        public string Priority
        {get{return this.priority}}

        private ArrayList Tasks
        {
            ArrayList taskList = new ArrayList();
            taskList.Add( new TasksStuff("A foo task", "doing foo",1));
            return taskList;
        }
    }
}

I am really confused.


Solution

  • This should be the definition of Tasks for your sample to work correctly:

    public class Tasks : ObservableCollection<Task /*or whatever type you want to use here*/>
    {
        //...
    }
    

    --EDIT--

    // This is a class to store information for a single task
    // It has nothing to do with a collection of tasks
    public class Task
    {
        private String _taskName;
        public String TaskName
        {
            get { return _taskName; }
            set { _taskName = value; }
        }
    
        private String _description;
        public String Description
        {
            get { return _description; }
            set { _description = value; }
        }
    
        private Int32 _priority;
        public Int32 Priority
        {
            get { return _priority; }
            set { _priority = value; }
        }
    
        public Task(String taskName, String description, Int32 priority)
        {
            this.TaskName = taskName;
            this.Description = description;
            this.Priority = priority;
        }
    }
    
    // This is a class that is a collection of Task types
    // Since it inherits from ObservableCollection, it is itself a collection
    // There is no need to declare/create an ArrayList inside.
    // And on a strict note, do not ever use ArrayList. It is obsolete and not strongly typed.
    // Use List<T>, ObservableCollection<T>, etc. instead.
    // Look for more Generic Collections in System.Collections.Generic namespace
    public class Tasks : ObservableCollection<Task>
    {
        public Tasks()
        {
            Add(new Task("A foo task", "doing foo", 1));
        }
    }