6

OK Mam problem z tym problemem.Błąd czasu projektowania WPF Odwołanie do obiektu nie jest ustawione na wystąpienie obiektu

Próbuję ustawić UserControl tam, gdzie mogę zapełnić jego zawartość z XAML. Poprzednio stworzyłem ObservableCollection DependencyProperty. Pracował w czasie wykonywania, ale w czasie projektowania wystąpił błąd:

Odwołanie do obiektu nie jest ustawione na wystąpienie obiektu.

Teraz zrobiłem prostszą wersję:

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

ten sposób chciałbym używać mojego 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> 

Jednak to wciąż daje mi ten błąd w czasie projektowania:

Odniesienie do obiektu nie ustawione na instancję obiektu.

Więc jeśli ktoś może mi pomóc, proszę.

Jak mogę uczynić UserControl, którego mogę używać jako natywnych formantów, które mogę zapełnić kolekcją elementów? Próbuję znaleźć odpowiedź już drugi dzień.

+1

Próbowałaś zadzwonić 'InitializeComponent(); "pierwszy? – Ofiris

Odpowiedz

8

zwykle sprawdzić, czy jestem w czasie projektowania przed podłączeniem się imprezy itp ..

To może być to, że Pojemnik jest null w trybie projektowania.

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

} 

Może w konstruktora należy to zrobić ..

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

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

Na innej notatki, choć myślę, że byłoby lepiej stosując ItemsControl

+1

Wow, bardzo dziękuję. Twój pomysł z "IsInDesignerMode" jest bardzo interesujący, ale link, który mi dałeś, jest niesamowity! W końcu wiem, jak to zrobić. Interesujące jest to, że wczoraj czytałem trochę tej strony i po krótkim przeczytaniu zdecydowałem, że nie jest to odpowiedź na mój problem. Najwyraźniej tak było i jeszcze raz dziękuję za pomoc. –

Powiązane problemy