c# - WPF C# 如何使用 x :array 在 WPF 中的自定义模型类中绑定(bind)和设置列表

标签 c# wpf xaml

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

我遇到的异常是:

Additional information: 'Set property 'Project.Model.GanttModel.Tasks' threw an exception.' Line number '19' and line position '27'.

这是 Model:GanttModel... 行。

我的问题是如何填充“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>

最佳答案

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

你有两个选择:

更改您的 TasksProperty使用 Task[]而不是 ObservableCollection<Task> .

或者构建一个 ObservableCollection<Task>在 XAML 中,但因为您不能在 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>

关于c# - WPF C# 如何使用 x :array 在 WPF 中的自定义模型类中绑定(bind)和设置列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17897763/

相关文章:

c# - 为什么 Entity Framework 对数据库进行如此多的往返?

c# - 用键盘输入日期只是数字,没有不必要的操作

c# - 如何在 wpf 中使用 SbyteToBoolConverter 转换器,在 UI 中将 bool 属性转换为 sbyte

C# 读取/写入 Access 数据库文件

c# - 如何获取在运行时分配 Name 的 TextBox 的 Text 值?

C#十六进制值0x12,是无效字符

c# - 如何对 Azure 存储表行键和分区键进行编码?

c# - 仅作为时间将时间字符串转换为 24 小时制

wpf - 如何使用ResourceDictionary中定义的样式

html - 即使控件是从 HTML/JS 或 XAML 创建的,Metro 控件是否会在低级别重用相同的代码路径?