views:

212

answers:

3

Is it possible to introduce 'custom' attributes into different UI Elements in XAML ? Also to read them later like we add attributes for server controls in ASP.NET ?

I intend to read specific attributes and operate on them together.

+2  A: 

The way I've accomplished that is by creating a new class that inherits the base control.

For example, I have a class called WebTextBox that inherits TextBox. And inside WebTextBox are some custom properties and events. By doing this you're inheriting all the behaviors of the TextBox control. But you can get creative here if you choose, even modifying the behavior by overriding events and such.

Anyway, after you create the class you'll then have to add the namespace for the project to the XAML. Something like this:

xmlns:me="clr-namespace:YourNamespace;assembly=YourAssembly"

And then you can add a WebTextBox (or whatever you call it) like this:

<me:WebTextBox CustomAttribute="cool stuff" />
Steve Wortham
Steve, Indeed a good idea. Would have used it if not for Attached properties. Thanks for Answering.
kanchirk
+2  A: 

It sounds like you're trying to find Attached Properties.

An attached property lets you add in a property, definable in Xaml, which can be "attached" to any UIelement. You then retrieve them in code like any other Dependency Property.

Reed Copsey
Reed, Thanks for the answer. Good to know it was within the Framework. Marking your asnwer as 'Correct'
kanchirk
+2  A: 

Here is the approach I tend to take with this.

Create a new class file called Meta:-

namespace SilverlightApplication1
{
  public static class Meta
  {
    #region SomeValue
    public static string GetSomeValue(DependencyObject obj)
    {
       return (string)obj.GetValue(SomeValueProperty);
    }
    public static void SetSomeValue(DependencyObject obj, string value)
    {
       obj.SetValue(SomeValueProperty, value);
    }

    public static readonly DependencyProperty SomeValueProperty =
      DependencyProperty.RegisterAttached("SomeValue", typeof(string), typeof(Meta),
        new PropertyMetadata(null));
    #end region

    #region SomeOtherValue
    // Boilerplate code from above.
    #end region
  }
}

A value can now be attached in XAML like this:-

<TextBox x:Name="txt" local:Meta.SomeValue="Hello, World!" />

At some point in code this value can be retrieved with:-

string value = Meta.GetSomeValue(txt);

Note you don't have to stick with String as the type of the property you can pretty much use any type you like with the limitation that if you can to attach it in XAML the type must be compatible with the way XAML constructs objects (for example requires a default constructor).

AnthonyWJones
Anthony, Thank you for the answer. I got some fresh insight coz of 'Custom' Attached properties.
kanchirk