2012-08-27 4 views
1

Je veux créer un contrôle personnalisé (ou le contrôle de l'utilisateur) qui a à la fois un TextBlock et une zone de texte comme dans la figure ci-dessous:Comment créer une zone de texte personnalisée avec un TextBlock?

enter image description here

Les deux propriétés texte TextBlock et Textbox doivent être liés à la champs de base de données et être en mesure d'appliquer un style, etc. Quelle est la meilleure approche pour le même?

Je suis venu avec une solution comme ci-dessous:

XAML pour le contrôle de l'utilisateur:

<UserControl x:Class="TestDependency.TextBlox" 
     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" 
     x:Name="abc" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}" > 
<Grid Width="170"> 
    <TextBlock Height="23" HorizontalAlignment="Left" Margin="0,1,0,0" 
       Text="{Binding Path=Caption}" 
       VerticalAlignment="Top" Width="52" /> 
    <TextBox Height="25" HorizontalAlignment="Left" Margin="53,-2,0,0" 
      x:Name="TextBox1" 
      Text="{Binding Path=Value}" 
      VerticalAlignment="Top" Width="120" /> 
</Grid> 

code derrière pour Usercontrol:

public partial class TextBlox : UserControl 
{ 
    public TextBlox() 
    { 
     InitializeComponent(); 
    } 

    public static DependencyProperty CaptionProperty = DependencyProperty.Register("Caption", typeof(string), typeof(TextBlox)); 
    public static DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(string), typeof(TextBlox)); 


    public string Caption 
    { 
     get 
     { 
      return (string)GetValue(CaptionProperty); 
     } 
     set 
     { 
      SetValue(CaptionProperty, value); 
     } 
    } 


    public string Value 
    { 
     get 
     { 
      return (string)GetValue(ValueProperty); 
     } 
     set 
     { 
      SetValue(ValueProperty, value); 
     } 
    } 

    static void ValueChangedCallBack(DependencyObject property, DependencyPropertyChangedEventArgs args) 
    { 
     TextBlox inst = (TextBlox)property; 
     inst.TextBox1.Text = (string)args.NewValue; 
    } 
} 

XAML pour la forme réelle où Usercontrol est utilisé:

<Grid x:Name="grdmain"> 
    <my:TextBlox Caption="{Binding XValue, Mode=TwoWay}" Value="{Binding WindowName, Mode=TwoWay}" 
     HorizontalAlignment="Left" Margin="246,197,0,0" x:Name="textBlox1" VerticalAlignment="Top" /> 
</Grid> 
code

derrière:

public partial class MainWindow : Window 
{ 
    DataEntities dt = new DataEntities(); 
    CoOrdinate oCord; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     Loaded += new RoutedEventHandler(MainWindow_Loaded); 
    } 

    void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     oCord = dt.CoOrdinates.First(); 
     grdmain.DataContext = oCord; 
    } 
} 

Toujours le travail ne marche pas contraignant. Mais le code:

textBlox1.Caption = "test"; 

fonctionne bien. Où ai-je tort?

Répondre

0

Créez un contrôle utilisateur avec un bloc de texte et une zone de texte et liez les valeurs à ce contrôle.

<YourUserControl TextBlockText="{Binding TextBlockText}" TextBoxText="{Binding TextBoxText, Mode=TwoWay}"/> 
+1

On dirait l'idée de base mais je ne pense pas que la liaison soit complète. –

+0

C'est vrai, mais je ne sais pas si Sony a un ViewModel ou pas ou comment il obtient ses valeurs – BvdVen

+2

Vous avez juste besoin de faire la liaison 2way, pour le TextBox – mlemay

Questions connexes