2012-07-11 8 views
31

Od niestandardowego formantu w oparciu o TextBox, stworzyłem właściwość o nazwie Items, w ten sposób:A „wiążące” można ustawić tylko na DependencyProperty z DependencyObject

public class NewTextBox : TextBox 
{ 
    public ItemCollection Items { get; set; } 
} 

Przy użyciu niestandardowego formantu w XAML , Nie mogę powiązać właściwości, ponieważ podnosi wyjątek "Wiązanie" może być ustawione tylko na DependencyProperty z DependencyObject. ".

Jak rozwiązać ten wyjątek?

+2

Tak.Tylko właściwości Dependency mogą działać jako obiekty docelowe dla powiązań. Źródłem może być właściwość zależności lub właściwość CLR, która implementuje INotifyPropertyChanged – Gishu

+0

To jest dokładny duplikat twojego drugiego pytania, gdzie akceptujesz odpowiedź i mówisz "ale musiałem zmodyfikować właściwość, aby uwzględnić DependencyProperty". Twoje rozwiązanie powinno znaleźć się w odpowiedzi na to pytanie. – arserbin3

+5

@AdamHouldsworth Tak, to pytanie zostało wysłane, aby opublikować odpowiedź. Jest to rzeczywiście zachęcane, ponieważ jest postrzegane jako forma dzielenia się wiedzą, a nawet istnieje [nowy "CheckBox" na formularzu pytania pytania] (http://meta.stackexchange.com/questions/132886/what-is- this-answer-your-own-question-jazz), które pozwolą ci napisać odpowiedź w tym samym czasie, w którym piszesz swoje pytanie. – Rachel

Odpowiedz

20

Aby rozwiązać ten wyjątek, należy zmienić właściwość Items i dodać DependencyProperty, który będzie działał jako "łącze" w XAML. Klasa będzie:

public class AutocompleteTextBox : TextBox 
{ 
    public ItemCollection Items 
    { 
     get { 
      return (ItemCollection)GetValue(ItemsProperty); } 
     set { 
      SetValue(ItemsProperty, value); } 
    } 

    public static readonly DependencyProperty ItemsProperty = 
     DependencyProperty.Register(
      "Items", 
      typeof(ItemCollection), 
      typeof(AutocompleteTextBox), 
      new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged)); 

    private static void OnItemsPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     // AutocompleteTextBox source = d as AutocompleteTextBox; 
     // Do something... 
    } 
53

Na marginesie, warto również zauważyć, że dostaniesz te błędy wiążące jeśli kopiować i wklejać między obiektami i zapomnij zmienić drugi typeof(Object) oświadczenie.

Nie mogłem znaleźć dobrej godziny, dlaczego dostałem ten błąd, ponieważ wszystko wydawało się być zdefiniowane i poprawne. Przeniosłem moje właściwości do kontroli użytkownika, ponieważ chciałem przejść od jednego zestawu do listy. Zatem:

public static readonly DependencyProperty FoldersProperty = DependencyProperty.Register("Folders", typeof(OutlookFolders), typeof(MainWindow), new FrameworkPropertyMetadata(new OutlookFolders())); 

public OutlookFolders Folders 
{ 
    get { return GetValue(FoldersProperty) as OutlookFolders; } 
    set { SetValue(FoldersProperty, value); } 
} 

Gdyby stały:

public static readonly DependencyProperty FoldersProperty = DependencyProperty.Register("Folders", typeof(OutlookFolders), typeof(SavedFolderControl), new FrameworkPropertyMetadata(new OutlookFolders())); 

public OutlookFolders Folders 
{ 
    get { return GetValue(FoldersProperty) as OutlookFolders; } 
    set { SetValue(FoldersProperty, value); } 
} 

Do Zrobiłem tę zmianę trzymałem otrzymaniu błąd: A 'Binding' cannot be set on the property 'Folders' of type 'SavedFolderControl'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.

+3

To. Skopiowałem kontrolkę UserControl z pewnymi właściwościami DependencyProperties, co oznacza, że ​​stara '' typeof (____) '' -Value nadal istnieje i jest poprawna. Nie dostaję żadnych błędów do czasu wykonania. A następnie XAML Parsing Exception "A Binding można ustawić tylko ..." i tak dalej. Dzięki! – ecth

+0

Może istnieć, ale kropka, które typy proponowanych typów faktycznie pasują do siebie. – netniV

+0

Nie, o to chodzi. Miałem na myśli, że klasa istnieje i jest ważna. Więc nie otrzymasz żadnych błędów w VS. Dopóki nie skompilujesz i nie uruchomisz. Ale wtedy nie wiesz, skąd bierze się błąd! To była moja mistyke po skopiowaniu .. – ecth

3

Inną potencjalną przyczyną tego jest, gdy podasz zły typ dla domyślna wartość w metadanych.
Na przykład:

new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged) 

rzucał ten błąd jeśli napisał zamiast:

new PropertyMetadata(false, OnItemsPropertyChanged) 

Może się również zdarzyć, jeśli kopiowanie i wklejanie ze źródła kodu.

16

Oto kolejny przykład: Upewnij się, że ciąg w pierwszym argumencie DependencyProperty.Register() pasuje do nazwy powiązanej właściwości.

public static readonly DependencyProperty ItemsProperty = 
    DependencyProperty.Register(
     "TheItems", // This is wrong 
     typeof(ItemCollection), 
     typeof(AutocompleteTextBox), 
     new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged)); 

Wpadłem na ten problem, gdy zmieniłem nazwę mojej nieruchomości bez zmiany ciągu.

+4

Upewnij się, że nazwa to "Items", a nie "ItemsProperty". –

+7

Możesz użyć nameof (Items) w najnowszych wersjach .NET, aby uniknąć tego problemu. – Herman

0

miałem wiadomość (czas pracy + designtime):

An unhandled exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll

Additional information: A 'Binding' cannot be set on the 'Property' property of type 'Trigger'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.

gdzie jestem wystarczająco inteligentny, aby zdefiniować wyzwalanie nieruchomości VM ..

// incorrect.. canont have Trigger for VM property 
<Trigger Property="{Binding IsExpanded}" Value="True"> 
    <Setter Property="Visibility" Value="Visible"/> 
</Trigger> 

Które powinny oczywiście być DataTrigger (który używa wiązania zamiast własności)

<dataTrigger Binding="{Binding IsExpanded}" Value="True"> 
    <Setter Property="Visibility" Value="Visible"/> 
</Trigger> 

Wyzwalacze są zwykle dla sterowania (przycisk, tekstBox , FrameworkElement itp.) Właściwości.

Powiązane problemy