2008-09-16 19 views
18

Al desarrollar UserControls de WPF, ¿cuál es la mejor manera de exponer una DependencyProperty de un control secundario como DependencyProperty de UserControl? El siguiente ejemplo muestra cómo exponer actualmente la propiedad Text de un TextBox dentro de un UserControl. Seguramente hay una manera mejor/más simple de lograr esto?Exponer DependencyProperty

<UserControl x:Class="WpfApplication3.UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Background="LightCyan"> 
     <TextBox Margin="8" Text="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" /> 
    </StackPanel> 
</UserControl> 


using System; 
using System.Windows; 
using System.Windows.Controls; 

namespace WpfApplication3 
{ 
    public partial class UserControl1 : UserControl 
    { 
     public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(UserControl1), new PropertyMetadata(null)); 
     public string Text 
     { 
      get { return GetValue(TextProperty) as string; } 
      set { SetValue(TextProperty, value); } 
     } 

     public UserControl1() { InitializeComponent(); } 
    } 
} 

Respuesta

17

Esa es la forma en que lo estamos haciendo en nuestro equipo, sin la búsqueda RelativeSource, en lugar nombrando el control de usuario y hacer referencia a las propiedades para el nombre del control de usuario.

<UserControl x:Class="WpfApplication3.UserControl1" x:Name="UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Background="LightCyan"> 
     <TextBox Margin="8" Text="{Binding Path=Text, ElementName=UserControl1}" /> 
    </StackPanel> 
</UserControl> 

veces que hemos encontrado a nosotros mismos haciendo demasiadas cosas de control de usuario embargo, y muchas veces han reducido nuestro uso. También seguiría la tradición de nombrar elementos como ese cuadro de texto en la línea de PART_TextDisplay o algo así, para que en el futuro puedas modelarlo y mantener igual el código subyacente.

+0

esta manera funciona mejor en Silverlight 4, donde no hay 'FindAncestor' –

+0

Esto funcionó para mí, sin embargo, no parece que pueda use el mismo 'x: Class' y' x: Name'. Tenía que tener una clase como 'WpfApplication1.SliderLabel' y le di un nombre como' SliderLabelControl'. De lo contrario, se quejaba de que el nombre ya existía. –

1

Puede establecer DataContext a esto en el constructor de UserControl, luego solo enlazar por una sola ruta.

CS:

DataContext = this; 

XAML:

<TextBox Margin="8" Text="{Binding Text} /> 
+1

esto solo funciona en una escala limitada. si realmente necesitas un contexto de datos estás jodido –

Cuestiones relacionadas