15

Potrzebuję utworzyć nową właściwość do istniejących formantów WPF (Groupbox, pole tekstowe, pole wyboru itp.), Która będzie przechowywać swój poziom dostępu, dlatego Odkryłem załączone właściwości. użyłem jako przykład ta strona http://dotnetbyexample.blogspot.com.br/2010/05/attached-dependency-properties-for.htmlC# WPF Załączone właściwości - Błąd: "Właściwość nie istnieje w obszarze nazw XML"

Wszystko było w porządku, ale potem mam następujący błąd podczas próby użycia go na pewną kontrolę ...

Error 1 The property 'DependencyPropertiesHoster.AcessLevel' does not exist in XML namespace 'clr-namespace:ImageGUI.App_Code;assembly=ImageGUI'. Line 131 Position 97. ImageGUI\MainWindow.xaml 131 97 ImageGUI

To jest mój kod C# urywek ...

namespace ImageGUI.App_Code 
{  
    public static class DependencyPropertiesHoster 
    { 
    //[AttachedPropertyBrowsableForChildren] 
    public static readonly DependencyProperty AcessLevelProperty = 
     DependencyProperty.RegisterAttached("AcessLevel", 
     typeof(EAcessLevel), 
     typeof(DependencyPropertiesHoster), 
     new PropertyMetadata(AcessLevelChanged)); 

    // Called when Property is retrieved 
    public static EAcessLevel GetAcessLevel(DependencyObject obj) 
    { 
     if (obj != null) 
      return (EAcessLevel)obj.GetValue(AcessLevelProperty); 
     else 
      return EAcessLevel.Client; 
     //return obj.GetValue(AcessLevelProperty) as EAcessLevel; 

    } 

    // Called when Property is set 
    public static void SetAcessLevel(
     DependencyObject obj, 
     EAcessLevel value) 
    { 
     obj.SetValue(AcessLevelProperty, value); 
    } 

    // Called when property is changed 
    private static void AcessLevelChanged(
    object sender, 
    DependencyPropertyChangedEventArgs args) 
    { 
     var attachedObject = sender as UIElement; 
     if (attachedObject != null) 
     { 
      // do whatever is necessary, for example 
      // attachedObject.CallSomeMethod(     
      // args.NewValue as TargetPropertyType); 
     } 
    } 
} 

}

Oto moja deklaracja w oknie

xmlns:CustomDepen="clr-namespace:ImageGUI.App_Code;assembly=ImageGUI" 

I tu jest moje korzystanie z nieruchomości (gdzie leży błąd ...)

<GroupBox Name="gbApplications" Header="{DynamicResource applications}" CustomDepen:DependencyPropertiesHoster.AcessLevel="Client"> 

Obserwacja: EAcessLevel jest tylko prosty wyliczający.

Z góry dziękuję.

+3

Czy jesteś pewien, że 'AcessLevel' jest w zespole' ImageGUI'? Czy to działa, jeśli usuniesz część deklaracji "assembly = ImageGUI"? –

+3

+1 dla kogoś, kto w końcu zawiera wystarczające informacje w pytaniu dotyczącym SO. Aby dodać komentarz @ Bob, jeśli twoja dołączona właściwość (lub cokolwiek innego) jest w tym samym zespole co Twój XAML, nie powinieneś uwzględniać części 'assembly =' w mapowaniu obszaru nazw XML-> CLR. –

+0

Dziękujemy! Nie mogę uwierzyć, że to było takie proste, ale cieszę się, że tak było. Usunięcie części końcowej spowodowało naprawienie (montaż = ...). Ale zastanawiam się, jak mogę uzyskać tę właściwość w kodzie? Jak mogę teraz pobrać programowo? przykład scenariusza doskonałego: EAcessLevel controlAcess = gbApplications.AcessLevel; – Luishg

Odpowiedz

14

Dzięki Bobowi i Kentowi za odpowiedzi, to prawie rozwiązało problem. W tym scenariuszu po prostu zmieniając

xmlns:CustomDepen="clr-namespace:ImageGUI.App_Code;assembly=ImageGUI" 

do

xmlns:CustomDepen="clr-namespace:ImageGUI.App_Code" 

stałe sytuację. Cała reszta była poprawna.

chodzi o moją drugą komentarz o jak pobrać określoną wartość, to byłoby tak:

EAcessLevel currentAcess = (EAcessLevel)gbApplications.GetValue(DependencyPropertiesHoster.AcessLevelProperty); 

Dzięki i mam nadzieję, że ktoś pomaga również w przyszłości.