2008-12-10 24 views
6

XAML sau (bên dưới) xác định một tập hợp tùy chỉnh trong tài nguyên và cố gắng điền nó với một đối tượng tùy chỉnh;Làm cách nào để giải quyết lỗi thiết kế WPF 'Loại {0} không hỗ trợ nội dung trực tiếp'. '?

<UserControl x:Class="ImageListView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="300" Height="300" 
    xmlns:local="clr-namespace:MyControls" > 
    <UserControl.Resources> 
     <local:MyCustomCollection x:Key="MyKey"> 
      <local:MyCustomItem> 
      </local:MyCustomItem> 
     </local:MyCustomCollection> 
    </UserControl.Resources> 
</UserControl> 

Vấn đề là tôi gặp lỗi trong trình thiết kế 'Loại' MyCustomCollection 'không hỗ trợ nội dung trực tiếp'. Tôi đã cố gắng thiết lập ContentProperty như được khuyên trong MSDN nhưng không thể tìm ra những gì để thiết lập nó. Các đối tượng thu tùy chỉnh mà tôi sử dụng là dưới đây và rất đơn giản. Tôi đã thử Item, Items và MyCustomItem và không thể nghĩ ra những thứ khác để thử.

<ContentProperty("WhatGoesHere?")> _ 
Public Class MyCustomCollection 
    Inherits ObservableCollection(Of MyCustomItem) 
End Class 

Bất kỳ manh mối nào về nơi tôi gặp sai sẽ được biết ơn. Ngoài ra gợi ý về cách đào sâu vào mô hình đối tượng WPF để xem những thuộc tính nào được phơi bày trong thời gian chạy, tôi cũng có thể tìm ra nó theo cách đó.

Trân

Ryan

Trả lời

5

Bạn cần phải khởi tạo ContentPropertyAttribute với tên của thuộc tính đó sẽ đại diện cho nội dung của lớp học của bạn. Trong trường hợp của bạn, vì bạn kế thừa từ ObservableCollection, đó sẽ là thuộc tính Items. Thật không may, thuộc tính Items là chỉ đọc và không được phép, vì thuộc tính Content phải có một setter. Vì vậy, bạn phải xác định thuộc tính trình bao bọc tùy chỉnh xung quanh Mặt hàng và sử dụng thuộc tính đó - như vậy:

public class MyCustomItem 
{ } 

[ContentProperty("MyItems")] 
public class MyCustomCollection : ObservableCollection<MyCustomItem> 
{ 
    public IList<MyCustomItem> MyItems 
    { 
     get { return Items; } 
     set 
     { 
      foreach (MyCustomItem item in value) 
      { 
       Items.Add(item); 
      } 
     } 
    } 
} 

Và bạn sẽ ổn thôi. Xin lỗi vì đã làm điều đó trong C# khi ví dụ của bạn là VB, nhưng tôi thực sự hút VB và thậm chí không thể có được một điều đơn giản như vậy ... Dù sao, đó là một snap để chuyển đổi nó, vì vậy - hy vọng rằng sẽ giúp.

+0

Có vẻ tốt, nhưng là câu hỏi về setter của bạn ở đó. Nó sẽ không chỉ liên tục thêm vào bộ sưu tập và gây ra một ngoại lệ? Ngoài ra, tại sao IList và không phải ObservableCollection? Cảm ơn –

+0

Không, nó sẽ chỉ thêm nhiều mục như bạn có trong biến giá trị đến - và đó là những giá trị bạn xác định trong XAML. Và đó là IList , vì đó là loại thuộc tính Items. Hãy nhớ rằng, trình bao bọc dành cho thuộc tính Items, không dành cho toàn bộ lớp. – Boyan

+0

Cảm ơn, đó là lời khuyên tuyệt vời. Nhiều đánh giá cao. –

Các vấn đề liên quan