简体   繁体   中英

How to create a custom Textbox with a TextBlock?

I want to create a custom control(or user control) which has both a textblock and a textbox as in the fig below:

在此处输入图片说明

Both the textblock and Textbox text properties are to be bound to the database fields and be able to apply styling etc. Which is the best approach for the same?

I have come up with a solution as below:

XAML for user control:

<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 behind for 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 for actual form where Usercontrol is used:

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

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

Still the binding doesnt work. But the code :

textBlox1.Caption = "test"; 

is working fine. where am I wrong?

用文本块和文本框创建一个用户控件,然后将值绑定到该控件。

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM