2012-11-19 39 views
2

我必須實現WPF文本框,它將通過綁定提供修剪的文本。乍一看,這個任務對我來說看起來相當簡單。我決定使用依賴屬性值強制。下面我寫了我的代碼,但這似乎不起作用。我沒有在我的綁定屬性中修剪字符串。我究竟做錯了什麼?也許我應該採取另一種方法?WPF文本框文本強制

public class MyTextBox : TextBox 
{ 
    static MyTextBox() 
    { 
     TextProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata(string.Empty, null, new CoerceValueCallback(CoerceText))); 
    } 

    private static object CoerceText(DependencyObject d, object basevalue) 
    { 
     string s = basevalue as string; 
     if(s != null) 
     { 
      return s.Trim(); 
     } 
     else 
     { 
      return string.Empty; 
     } 
    } 
} 

我添加了一個簡單的窗口到我的應用程序進行測試。 的XAML:

<Window x:Class="TextBoxDemo.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:TextBoxDemo="clr-namespace:TextBoxDemo" 
    Title="MainWindow" 
    Width="525" 
    Height="350"> 
<Grid> 
    <TextBoxDemo:MyTextBox x:Name="textBox1" 
          Width="120" 
          Height="23" 
          Margin="55,73,0,0" 
          HorizontalAlignment="Left" 
          VerticalAlignment="Top" 
          Text="{Binding Text}" /> 
    <TextBoxDemo:MyTextBox x:Name="textBox2" 
          Width="120" 
          Height="23" 
          Margin="286,184,0,0" 
          HorizontalAlignment="Left" 
          VerticalAlignment="Top" 
          Text="{Binding Text}" /> 
</Grid> 
</Window> 

和代碼隱藏:

public partial class MainWindow : Window 
{ 
    private string _text; 

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

    public string Text 
    { 
     get { return _text; } 
     set 
     { 
      _text = value; 
      MessageBox.Show(string.Format("|{0}|", _text)); 
     } 
    } 
} 
+0

它看起來好像沒什麼問題。 MyTextBox的Text屬性值永遠不會在開頭或結尾包含空格。你試圖完成什麼? –

+0

我添加了我的測試應用程序的代碼。 MessageBox顯示未剪裁的文本。 – dzb

回答

0

奇怪的是,值強制不很好地結合工作。

This thread談論相同的問題,並提出一個或兩個解決方法。 其中之一是調用UpdateTarget()上文本框的明確綁定表達式:

textBox1.GetBindingExpression(MyTextBox.TextProperty).UpdateTarget(); 
+0

好吧,這似乎是一個解決方案,但何時調用UpdateTarget?我的文本框不應該需要程序員的任何其他操作,而不是聲明XAML中的綁定。 – dzb

+0

..在你的CoerceText()函數中>在完成設置編輯後的值後,調用UpdateTarget() – Li3ro