在WPF中实现转换器的自定义TextBox用户控件

问题描述:

我正在尝试构建一个自定义用户控件,准确地说是一个自定义TextBox。这个想法是当用户键入TextBox时文本被转换为大写并显示。但我无法让它工作。在WPF中实现转换器的自定义TextBox用户控件

CustomTextBox用户控件:

<UserControl x:Class="SOFWpf.CustomTextBox" 
      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" 
      xmlns:converters="clr-namespace:SOFWpf.Converters" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <UserControl.Resources> 
     <converters:CaseConverter x:Key="CaseConverter" /> 
    </UserControl.Resources> 

    <TextBox Text="{Binding Path=., Converter={StaticResource CaseConverter}}"/> 

用户控件的代码隐藏:

public string Text 
    { 
    get { return (string)GetValue(TextProperty); } 
    set { SetValue(TextProperty, value); } 
    } 

    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), typeof(CustomTextBox), new UIPropertyMetadata("")); 

用法:

<local:CustomTextBox Text="a b c"/> 

转换器:

public class CaseConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
     string text = value as string; 

     return text?.ToUpper(); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
     string text = value as string; 

     return text?.ToLower(); 
     } 
    } 
+0

你只想要显示的文本是大写的还是你希望textblock后面的实际数据也是大写? – Tesseract

+0

不,只是为了显示它! – Vahid

+0

其实现在有一些问题,甚至没有显示! – Vahid

您需要添加绑定路径=文本:

<TextBox Text="{Binding Path=Text, Converter={StaticResource CaseConverter}}"/> 

而且在设置的DataContext这个用户控件的构造:

public CustomTextBox() 
{ 
    InitializeComponent(); 
    DataContext = this; 
}