6

Ok Tôi đang bị bệnh về vấn đề này.Lỗi thời gian thiết kế WPF Tham chiếu đối tượng không được đặt thành một thể hiện của một đối tượng

Tôi đang cố gắng tạo UserControl nơi tôi có thể điền nội dung của nó từ XAML. Trước đây tôi đã tạo ObservableCollection DependencyProperty. Nó hoạt động trong thời gian chạy nhưng tại thời điểm thiết kế đã xảy ra lỗi:

Tham chiếu đối tượng không được đặt thành phiên bản của đối tượng.

Bây giờ tôi đã làm phiên bản đơn giản:

public partial class UC : UserControl 
{ 
    public UC() 
    { 
     Labels = new ObservableCollection<Label>(); 
     InitializeComponent(); 

     Labels.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Labels_CollectionChanged); 
    } 

    void Labels_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     foreach (Label uc in e.NewItems) 
      Container.Children.Add(uc); 
    } 

    private ObservableCollection<Label> _lables = new ObservableCollection<Label>(); 

    public ObservableCollection<Label> Labels 
    { 
     get { return _lables; } 
     set { _lables = value; } 
    } 
} 

Đây là cách tôi thích sử dụng UserControll tôi

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns:gsh="clr-namespace:WpfApplication1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid Margin="0,0,0,30"> 
    <gsh:UC x:Name="uC1"> 
     <gsh:UC.Labels> 
      <Label Content="qwerty1" /> 
      <Label Content="qwerty2" /> 
     </gsh:UC.Labels> 
    </gsh:UC> 
</Grid> 

Tuy nhiên nó vẫn mang lại cho tôi lỗi tại thời gian thiết kế:

Tham chiếu đối tượng không đặt thành một thể hiện của một đối tượng.

Vì vậy, nếu có ai có thể giúp tôi.

Làm cách nào để tôi có thể tạo UserControl mà tôi có thể sử dụng như các điều khiển gốc mà tôi có thể điền bằng tập hợp các phần tử? Tôi đang cố gắng tìm câu trả lời vào ngày thứ hai.

+1

Cậu cố gắng gọi 'InitializeComponent(); 'đầu tiên? – Ofiris

Trả lời

8

tôi thường kiểm tra xem tôi đang trong thời gian thiết kế trước khi dây lên các sự kiện vv ..

Có thể là container của bạn là null trong chế độ thiết kế.

public class Utils 
{ 
    public static bool IsInDesignerMode 
    { 
     get 
     { 
      return ((bool)(DesignerProperties.IsInDesignModeProperty 
       .GetMetadata(typeof(DependencyObject)).DefaultValue)); 
     } 
    } 

} 

Có lẽ trong constructor của bạn, bạn nên làm điều này ..

public UC()  
{  
    InitializeComponent();  
    if (!Utils.IsInDesignerMode) 
    { 
     Labels = new ObservableCollection<Label>();  

     Labels.CollectionChanged += new   System.Collections.Specialized.NotifyCollectionChangedEventHandler(Labels_CollectionChanged);  
    } 
} 

Ngày lưu ý khác mặc dù tôi nghĩ rằng bạn sẽ tốt hơn sử dụng một ItemsControl

+1

Wow có nghĩa là cảm ơn bạn rất nhiều. Ý tưởng của bạn với "IsInDesignerMode" là rất thú vị nhưng liên kết bạn đã cho tôi là tuyệt vời! Cuối cùng tôi biết làm thế nào để làm điều đó. Điều thú vị là ngày hôm qua tôi đã đọc một chút của trang này và sau khi đọc ngắn tôi quyết định rằng nó không phải là một câu trả lời cho vấn đề của tôi. Rõ ràng nó đã được và cảm ơn bạn một lần nữa cho sự giúp đỡ của bạn. –

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