2012-04-18 21 views
5

Estoy haciendo una demostración simple para aprender cómo crear un control de usuario vinculable. He creado una clase simple:¿Cómo se puede enlazar un control de usuario XAML personalizado?

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

Y un muy simple control de usuario:

<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> 

Lo que me gustaría saber es ¿qué es lo que tengo que hacer con el fin de poder utilizar el usuario controlar en contexto como un control normal. Puedo añadir esto a la MainWindow:

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

y luego puedo combatirla a través de código detrás y añade el valor:

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

yo preferiría ser capaz de crear una instancia de la clase Person y simplemente vincula el control en la ventana principal a la clase Person.

Respuesta

5

Un par de cosas que debe hacer para que esto funcione.

En su código subyacente, agregue una propiedad de dependencia para el objeto persona desea que su control para saber acerca de:

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

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

En el XAML, configurar el código subyacente como su contexto de datos y añadir la la unión a su objeto persona:

<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> 

Ahora, cada vez que la propiedad se establece persona, de su control se actualizará con los primeros y últimos nombres que se asocian a la persona.

+1

Puede ser útil no cambiar 'DataContext', especialmente si este' UserControl' termina siendo 'ContentControl'. Una solución simple a esto sería nombrar el control del usuario y referenciarlo en los enlaces a través de 'ElementName'. – user7116

+0

sixlettervariables es correcto. Eche un vistazo a esta [explicación] (http://www.scottlogic.co.uk/blog/colin/2012/02/a-simple-pattern-for-creating-re-useable-usercontrols-in-wpf-silverlight /) por la razón. – LPL

+0

He realizado el cambio recomendado por sixlettervariables en mi publicación original anterior. – Curtis

2

cómo se llama Dependency Property se puede enlazar desde xaml.
1-crear el campo

public static readonly DependencyProperty FirstNameProperty = 
    DependencyProperty.Register(
    "FirstName", typeof(Strin), 

2-crear la propiedad

public String FirstName 
{ 
    get { return (String)GetValue(FirstNameProperty); } 
    set { SetValue(FirstNameProperty, value); } 
} 

3- se puede usar en el XAML para obligar a éste o simplemente usarlo

<local:YourControlName FirstName="john"/> 

<local:YourControlName FirstName="{Binding MyFirstName}"/> 
  • use Resharper le ayudará a hacer un código limpio y tendrá un IntelliSense muy potente
+0

gracias, parece que me faltaba. Trabajaré en unir eso. –

+0

otra pregunta si puedo, ¿puedo vincular todo el control en lugar de solo una propiedad? –

Cuestiones relacionadas