2010-11-15 6 views
0

J'ai un UserControl où j'aimerais avoir quelques paramètres de personnalisation "radius" (double) et "contentSource" (string []).WPF DependencyProperty Exposition dans UserControl?

Mon UserControl se compose de quelques contrôles imbriqués:

<UserControl ...> 
<Grid> 
    <my:Menu ...> 
     <my:Button> 
     </my:Button> 
     <my:Button> 
     </my:Button> 
     <my:Button> 
     </my:Button> 
    </my:Menu ...> 
</Grid> 

Je suis en train d'exposer les paramètres avec:

public double Rad 
    { 
     get { return (double)GetValue(RadProperty); } 
     set { SetValue(RadProperty, value); } 
    } 
    public static readonly DependencyProperty RadProperty = 
     DependencyProperty.Register(
      "Radius", 
      typeof(double), 
      typeof(Menu)); 

    public String[] DataSource 
    { 
     get { return (String[])GetValue(DataSourceProperty); } 
     set { SetValue(DataSourceProperty, value); } 
    } 
    public static readonly DependencyProperty DataSourceProperty = 
     DependencyProperty.Register(
      "DataSource", 
      typeof(String[]), 
      typeof(Menu)); 

Cependant, il semble y avoir deux problèmes , le paramètre "string []" semble provoquer des crashs, mais surtout, je ne peux pas définir la propriété "Radius" du tout. Y a-t-il autre chose que je dois faire pour exposer le paramètre?

Répondre

2

Comment essayez-vous d'accéder aux valeurs? J'ai copié votre code dans un UserControl et il semble fonctionner correctement. Avez-vous défini DataContext pour l'objet auquel vous accédez à ces valeurs?

Voici mon code de test, ce qui pourrait aider:

public partial class uc : UserControl 
{ 
    public uc() 
    { 
     InitializeComponent(); 

     this.DataContext = this; 
     this.DataSource = new string[] { "hello","There" }; 
     this.Rad = 7; 
    } 
    public String[] DataSource 
    { 
     get { return (String[])GetValue(DataSourceProperty); } 
     set { SetValue(DataSourceProperty, value); } 
    } 
    public static readonly DependencyProperty DataSourceProperty = 
     DependencyProperty.Register(
      "DataSource", 
      typeof(String[]), 
      typeof(uc)); 

    public double Rad 
    { 
     get { return (double)GetValue(RadProperty); } 
     set { SetValue(RadProperty, value); } 
    } 
    public static readonly DependencyProperty RadProperty = 
     DependencyProperty.Register(
      "Radius", 
      typeof(double), 
      typeof(uc)); 

} 

et XAML:

<UserControl x:Class="WpfApplication18.uc" 
      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> 
     <StackPanel> 
      <TextBox Text="{Binding Path=DataSource[0]}"></TextBox> 
      <TextBox Text="{Binding Path=DataSource[1]}"></TextBox> 
      <TextBox Text="{Binding Path=Radius}"></TextBox> 
      <TextBox Text="{Binding Path=Radius}"></TextBox> 
     </StackPanel> 
    </Grid> 
</UserControl> 
+0

cela semble bon, il y a des choses que je ne savais pas, mais je me sers de mon UserControl dans une classe différente, et faire quelque chose comme: Puis-je faire quelque chose comme ça? – Verhogen

+0

Oui, mais vous devez utiliser le nom de la propriété publique, qui est "Rad". Cela fonctionnera:

+0

ah, j'ai maintenant trouvé que mon problème est que les valeurs ne sont pas encore définies lorsque nous sommes dans le constructeur du CustomControl. Y at-il quelque part où le contrôle n'est pas encore affiché quand je pourrais lire la valeur qui a été définie? – Verhogen