6

Ok, me estoy hartando de este problema.WPF error de tiempo de diseño Referencia de objeto no establecida en una instancia de un objeto

Estoy tratando de hacer UserControl donde puedo poblar su contenido de XAML. Anteriormente creé ObservableCollection DependencyProperty. Funcionaba en tiempo de ejecución, pero en el momento del diseño había un error:

Referencia de objeto no establecida en una instancia de un objeto.

Ahora me hicieron versión más simple:

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

Así es como me gusta usar mi 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> 

Sin embargo, todavía me da el error en tiempo de diseño:

Referencia de objeto no establecer a una instancia de un objeto.

Así que si alguien me puede ayudar, por favor.

¿Cómo puedo hacer UserControl que puedo usar como controles nativos que puedo completar con la colección de elementos? Estoy tratando de encontrar la respuesta el segundo día ya.

+1

¿trató de llamar 'InitializeComponent(); 'primero? – Ofiris

Respuesta

8

lo general comprobar para ver si estoy en tiempo de diseño antes de cablear hasta eventos etc ..

Podría ser que el contenedor es nulo en el modo de diseño.

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

} 

Tal vez en su constructor debe hacer esto ..

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

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

En otra nota, aunque yo creo que sería mejor usar un ItemsControl

+1

Wow, muchas gracias. Tu idea con "IsInDesignerMode" es muy interesante, pero el enlace que me has dado es increíble. Finalmente sé cómo hacerlo. Lo interesante es que ayer estaba leyendo un poco de esta página y después de una breve lectura decidí que no era una respuesta para mi problema. Al parecer fue y gracias de nuevo por su ayuda. –

Cuestiones relacionadas