2010-07-05 689 views
6

Tengo un control de usuario en WPF que quiero que el texto de una de sus etiquetas se lea del XAML donde se utiliza. Por lo tanto ..Configuración del valor de la propiedad XAML para el control del usuario

Mi Control de Usuario:

<UserControl x:Class="muc"> 
     <Label Foreground="#FF7800" FontSize="20" FontWeight="Bold">   
      <Label.Content> 
       <Binding ElementName="TestName" Path="." /> 
      </Label.Content> 
     </Label> 
</UserControl> 

Luego de usarlo:

<mycontorls:muc TestName="This is a test" /> 

pero no funciona ... ¿Cómo puedo leer las propiedades?

+1

Todo lo que desea es una propiedad de dependencia denominada TestName que se debe crear en el código subyacente del UserControl como retrata AlvinfromDiaspar. A continuación, puede vincular el contenido de la Etiqueta a la propiedad TestName del UserControl utilizando ElementName (Quartermeister ) o enlace RelativeSource (respuesta de Pavel Minaev). – Amsakanna

Respuesta

3

¡Solo he hecho esto con Silverlight, pero no me sorprendería si funciona de la misma manera!

// <summary> 
// Xaml exposed TextExposedInXaml property. 
// </summary> 
public static readonly DependencyProperty TestNameProperty = DependencyProperty.Register("TestName", typeof(string), typeof(NameOfMyUserControl), new PropertyMetadata(string.empty)); 

// <summary> 
// Gets or sets the control's text 
// </summary> 
public string TextExposedInXaml 
{ 
      get 
      { 
       return (string)GetValue(TestNameProperty); 
      } 

      set 
      { 
       SetValue(TestNameProperty , value); 

       // set the value of the control's text here...! 
      } 
} 
4

Si usted le da el elemento de control de usuario raíz de un nombre, a continuación, se puede hacer referencia a él mediante ElementName:

<UserControl x:Class="muc" 
      Name="rootElement"> 
    <Label Foreground="#FF7800" FontSize="20" FontWeight="Bold"> 
     <Label.Content> 
      <Binding ElementName="rootElement" Path="TestName" /> 
     </Label.Content> 
    </Label> 
</UserControl> 

También puede utilizar la sintaxis de extensión de marcado para que sea un poco más corto:

<UserControl x:Class="muc" 
      Name="rootElement"> 
    <Label Foreground="#FF7800" FontSize="20" FontWeight="Bold" 
      Content="{Binding TestName, ElementName=rootElement}"/> 
</UserControl> 

Recuerde también que su control se creará antes de que se establezcan sus propiedades. Deberá implementar INotifyPropertyChanged o tener TestName como una propiedad de dependencia para que el enlace vuelva a evaluarse después de que se establezca la propiedad.

0

{Binding ElementName=x} se une a un elementocon el nombre x en el árbol de elementos, no hay nada aquí que se ocupa de la propiedad TestName. Si desea una propiedad en su control de usuario, entonces debe definir la propiedad en la clase correspondiente a ese control de usuario (en su caso sería muc) y usar {Binding RelativeSource={RelativeSource FindAncestor, ...}} para referenciarlo en su control de usuario (consulte here para detalles), o darle un nombre para que pueda usar ElementName.

8

probé las dos primeras respuestas y lo que me trabajé en código, pero no en XAML (también no le permiten ver los cambios en la vista de diseño cuando se utiliza el control).

Para obtener una propiedad de trabajo como cualquier otro nativo, aquí es el proceso completo: (El ejemplo agrega una propiedad de dependencia de tipo anulable para mostrar en el control como texto o un defecto si null)

  1. En el archivo de código:

    1.a definir una propiedad de dependencia:

    public static readonly DependencyProperty MyNumberProperty = DependencyProperty.Register("MyNumber", typeof(Nullable<int>), typeof(MyUserControl), new PropertyMetadata(null, new PropertyChangedCallback(OnMyNumberChanged))); 
    

    1.b Implementar el OnMyNumberChanged de devolución de llamada:

    private static void OnMyNumberChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args){ 
        // When the color changes, set the icon color PlayButton 
        MyUserControl muc = (MyUserControl)obj; 
        Nullable<int> value = (Nullable<int>)args.NewValue; 
        if (value != null) 
        { 
         muc.MyNumberTextBlock.Text = value.ToString(); 
        } 
        else 
        { 
         muc.MyNumberTextBlock.Text = "N/A"; 
        } 
    } 
    

    1.c aplicar la propiedad MyNumber (no dependencia) para utilizar la propiedad de dependencia para la fácil de usar código:

    public Nullable<int> MyNumber{ 
        get 
        { 
         return (Nullable<int>)GetValue(MyNumberProperty); 
        } 
        set 
        { 
         SetValue(MyNumberProperty, value); 
         OnTargetPowerChanged(this, new DependencyPropertyChangedEventArgs(TargetPowerProperty, value, value)); // Old value irrelevant. 
        } 
    } 
    
  2. En el archivo XAML unirse texto del control TextBlock a la propiedad (no dependencia) para obtener el valor por defecto de la propiedad de dependencia en caso de que no se establece por el usuario del control (suponiendo que llamó su elemento raíz del control de usuario "RootElement"):

este código:

< TextBlock Name="MyNumberTextBlock" Text="{Binding MyNumber, ElementName=RootElement}"/> 
Cuestiones relacionadas