6

Ok mi sto ammalando di questo problema.Errore di progettazione WPF Riferimento dell'oggetto non impostato su un'istanza di un oggetto

Sto cercando di rendere UserControl dove posso popolare il suo contenuto da XAML. In precedenza ho creato ObservableCollection DependencyProperty. Sta funzionando in fase di esecuzione ma in fase di progettazione si è verificato un errore:

Riferimento oggetto non impostato su un'istanza di un oggetto.

Ora ho fatto la versione più semplice:

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; } 
    } 
} 

Questo è come mi piace usare la mia UserControll

<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> 

Tuttavia ancora mi dà l'errore in fase di progettazione:

Riferimento oggetto non impostato su un'istanza di un oggetto.

Quindi se qualcuno può aiutarmi per favore.

Come posso rendere UserControl che posso utilizzare come controlli nativi che posso popolare con la raccolta di elementi? Sto cercando di trovare la risposta già il secondo giorno.

+1

Hai provato a chiamare 'InitializeComponent(); 'prima? – Ofiris

risposta

8

Io di solito controllare per vedere se sono in fase di progettazione prima di cablare gli eventi ecc ..

potrebbe essere che il vostro contenitore è nullo in modalità di progettazione.

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

} 

Forse nel costruttore si dovrebbe fare questo ..

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

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

In un'altra nota anche se penso che sarebbe meglio utilizzare un ItemsControl

+1

Wow significa molto grazie. La tua idea con "IsInDesignerMode" è molto interessante ma il link che mi hai dato è fantastico! Finalmente so come farlo. La cosa interessante è che ieri stavo leggendo un po 'di questa pagina e dopo una breve lettura ho deciso che non era una risposta per il mio problema. Apparentemente lo è stato e grazie ancora per il tuo aiuto. –