WPF C#如何使用x:array在WPF中的自定义模型类中绑定和设置List

时间:2013-07-27 12:20:02

标签: c# wpf xaml

我第一次涉足WPF领域遇到问题,尝试在XAML的自定义模型类中填充列表。

我得到的例外是:

  

其他信息:'设置属性'Project.Model.GanttModel.Tasks'   抛出一个例外。'行号“19”和行位置“27”。

这是Model:GanttModel ... line。

我的问题是如何填充“GanttModelTest”模型的“TasksTest”列表中的元素?

我的模特课程:

    public class GanttModel : DependencyObject {
    public static readonly DependencyProperty TasksProperty = DependencyProperty.Register("Tasks", typeof(ObservableCollection<Task>), typeof(GanttModel));
    public static readonly DependencyProperty ChartDateRangeProperty = DependencyProperty.Register("ChartDateRange", typeof(DateTimeRange), typeof(GanttModel));

    public DateTimeRange ChartDateRange {
        get {
            return GetValue(ChartDateRangeProperty) as DateTimeRange;
        }

        set {
            SetValue(ChartDateRangeProperty, value);
        }
    }

    public ObservableCollection<Task> Tasks {
        get {
            return GetValue(TasksProperty) as ObservableCollection<Task>;
        }

        set {
            SetValue(TasksProperty, value);
        }
    }

    public GanttModel() {
        this.Tasks = new ObservableCollection<Task>();
    }
}

我的XAML的相关部分:

    <UserControl.Resources>
    <x:Array x:Key="TasksTest" Type="Model:Task">
        <Model:Task Name="Task 1" Start="07-20-2013" Finish="08-01-2013" />
        <Model:Task Name="Task 2" Start="07-19-2013" Finish="07-31-2013" />
        <Model:Task Name="Task 3" Start="07-18-2013" Finish="07-30-2013" />
        <Model:Task Name="Task 4" Start="07-17-2013" Finish="07-29-2013" />
        <Model:Task Name="Task 5" Start="07-16-2013" Finish="07-28-2013" />
    </x:Array>

    <Model:GanttModel x:Key="GanttModelTest"
                      ChartDateRange="07-01-2013,08-01-2013"
                      Tasks="{StaticResource TasksTest}" />

    etc...etc...etc...

    <ListBox x:Name="GanttTasks"
             ItemsSource="{StaticResource GanttModelTest}"
             ItemTemplate="{StaticResource TaskTemplate}"/>

    </UserControl>

1 个答案:

答案 0 :(得分:2)

您的TasksProperty类型为ObservableCollection<Task>,但您尝试为其分配Task[]。因为这两种类型之间没有隐式约定,这就是Set抛出异常的原因。

您有两种选择:

TasksProperty改为使用Task[]而不是ObservableCollection<Task>

或者在XAML中构建ObservableCollection<Task>,但是因为您无法在WPF中使用XAML2009功能,所以无法在WPF XAML中直接创建ObservableCollection。另见文件:Notes on XAML Usage

您可以做的是从ObservableCollection

派生
public class TaskCollection : ObservableCollection<Task> { }

现在你可以在XAML中使用这个非通用版本:

<Model:TaskCollection x:Key="TasksTest">
        <Model:Task Name="Task 1" Start="07-20-2013" Finish="08-01-2013" />
        <Model:Task Name="Task 2" Start="07-19-2013" Finish="07-31-2013" />
        <Model:Task Name="Task 3" Start="07-18-2013" Finish="07-30-2013" />
        <Model:Task Name="Task 4" Start="07-17-2013" Finish="07-29-2013" />
        <Model:Task Name="Task 5" Start="07-16-2013" Finish="07-28-2013" />
</Model:TaskCollection>