2011-12-26 17 views
5

pisałem moją kontrolę i próbuje przekazać parametr do dodatkowego inicjalizacji ale są błędy = ((typu Ajustcontrol nie może mieć nazwę Attribut) Jak przekazać dane poprawnie To jest mój kod w C#:.?jak przekazać parametr do konstruktora sterującego wpf?

public AjustControl(BaoC input) 
     { 
      InitializeComponent(); 

      populateAdjustControl(input); 

     } 

Błąd: Błąd 15 Typ 'AjustControl' nie może mieć atrybutu Name Typy i typy wartości bez domyślnego konstruktora mogą być używane jako elementy w ResourceDictionary. Line 470 Position 26. D: \ Prj \ aaa \ MainWindow. xaml 470 26 Studio

+0

Proszę skopiować i wkleić oryginalny błąd z IDE zamiast przepisywania na swoje. Wydaje się, że są jakieś literówki. –

+0

Mam zaktualizowane moje pytanie, gdy pytasz –

+0

Trudno jest podjąć decyzję, nie widząc więcej kodu. Może się zdarzyć, że coś pomylisz, ale trudno jest coś zrobić. –

Odpowiedz

19

Tak więc, jak wskazuje błąd, nie możesz mieć kontrolek bez konstruktora bez parametrów w Xaml. Możesz go jeszcze dodać, jeśli mrówka do utworzenia instancji z kodu, ale xaml nie wywoła tego konstruktora.

public AjustControl(BaoC input) : this() 
{ 
    populateAdjustControl(input); 
} 

public AjustControl() 
{ 
    InitializeComponent(); 
} 

Jednakże, jeśli proszą, aby dodać właściwość niestandardową do kontroli, można dodać DependancyProperty.

public static readonly DependencyProperty NameProperty= 
    DependencyProperty.Register(
    "Name", typeof(string), 
... 
    ); 
public string Name 
{ 
    get { return (string)GetValue(NameProperty); } 
    set { SetValue(NameProperty, value); } 
} 

Po tym, można użyć kontroli jak

<custom:AjustControl Name="something" /> 
+0

Przepraszam za wykopanie tej starej odpowiedzi, ale staram się to osiągnąć. Mój problem polega na tym, że potrzebuję tego parametru w konstruktorze (aby móc ładować dane). Jednak właściwość zależności wydaje się być ustawiona tylko po konstruktorze. Czy masz pomysł, jak to zrobić? – Shimrod

+0

Właściwość jest częścią obiektu instancji, nie można jej ustawić przed utworzeniem instancji klasy za pomocą konstruktora, chyba że właściwość jest statyczna. –

+2

Rzeczywiście. W końcu użyłem zdarzenia 'Loaded' do załadowania moich danych, ponieważ DP jest ustawiony w tym momencie. Dzięki ! – Shimrod

0

nie jest jasne, z pytaniem, dlaczego trzeba przekazać parametr do konstruktora formantu niestandardowego.

  1. Być może dlatego, że trzeba ten formant niestandardowy do konsumpcji parametr przestępstwa zanim jakiekolwiek wartości bound są przekazywane z niestandardowego formantu do nadrzędnego za pośrednictwem mechanizmów właściwość zależność - zwłaszcza związane właściwości, które zużywają parametr konstruktora przestępstwa bezpośrednio lub pośrednio.

  2. Możliwe, że inicjalizacja za pomocą sparametryzowanego konstruktora jest jedynym sposobem, aby przejść z dowolnego powodu.

Nie znam żadnego rozwiązania dla przypadku 2. Ale gdy pojawia się to pytanie, przypadek 1 jest zwykle wymagany. W tym przypadku moim rozwiązaniem jest utworzenie zwykłej właściwości net dot. Zostanie to rozwiązane przed każdą właściwością zależności.

Może jednak wystąpić problem ze zwykłą właściwością dot Net. Jak wiążesz się z referencją? Kontrola w drzewie wizualnym dla np.? Istnieje na to rozwiązanie, ale dostępne tylko w nowszej wersji XAML. Można pisać

<MyCustomControl MyParameter="{x:Reference Name=Blah}"/> 

zamiast

<MyCustomControl MyNonParameter="{Binding ElementName=Blah}"/> 

I nie trzeba tworzyć DP za to. W kontrolerze Custrom można po prostu pisać:

class MyCustomControl { 
    // The parameter my constructor sadly can not have 
    public MyParameterType MyParameter { get; set; } 
Powiązane problemy