Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you make a custom XAML User Control bindable?

Tags:

c#

wpf

xaml

I am making a simple demo to learn how to create a bindable user control. I have created a simple class:

class Person
{
    public string firstName;
    public string lastName;    
    public Person(string first, string last)
    {
        firstName = first;
        lastName = last;
    }
}

And a very simple user control:

<UserControl x:Class="Example.ExampleHRControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <TextBlock x:Name="textFirstName"></TextBlock>
        <TextBlock x:Name="textLastName"></TextBlock>
    </Grid>
</UserControl>

What I would like to know is what do I need to do in order to be able to use the user control in context like a normal control. I can add this to the MainWindow:

<local:ExampleHRControl x:Name="Hr1"></local:ExampleHRControl>

and then I can address it through code behind and add the value:

Hr1.textFirstName.Text = "John";
Hr1.textLasttName.Text = "Doe";

I would prefer to be able to create an instance of the class Person and simply bind the control on the main window to the Person class.

like image 890
Steven Deam Avatar asked Apr 18 '12 20:04

Steven Deam


People also ask

What is custom controls in WPF?

WPF applications allows to create custom controls which makes it very easy to create feature-rich and customizable controls. Custom controls are used when all the built-in controls provided by Microsoft are not fulfilling your criteria or you don't want to pay for third-party controls.

What are user controls in WPF?

User controls, in WPF represented by the UserControl class, is the concept of grouping markup and code into a reusable container, so that the same interface, with the same functionality, can be used in several different places and even across several applications.

What is binding XAML?

Advertisements. Data binding is a mechanism in XAML applications that provides a simple and easy way for Windows Runtime Apps using partial classes to display and interact with data. The management of data is entirely separated from the way the data is displayed in this mechanism.


1 Answers

A couple things you need to do to make this work.

In your code-behind, add a dependency property for the Person object you want your control to know about:

   public static readonly DependencyProperty PersonProperty =
                          DependencyProperty.Register("Person", typeof(Person),
                                                      typeof(ExampleHRControl));

   public Person Person
   {
      get { return (Person)GetValue(PersonProperty); }
      set { SetValue(PersonProperty, value); }
   }

In your XAML, set up your code-behind as your data context and add the binding to your person object:

<UserControl x:Class="Example.ExampleHRControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300"
         x:Name="This">
    <Grid>
        <TextBlock x:Name="{Binding Path=Person.FirstName, ElementName=This}"/>
        <TextBlock x:Name="{Binding Path=Person.LastName, ElementName=This}"/>
    </Grid>
</UserControl>

Now, whenever the Person property is set, your control will update itself with the First and Last names that are associated to the Person.

like image 196
Curtis Avatar answered Sep 30 '22 01:09

Curtis