2009-07-14 93 views
5

我有一個文本框,我綁定到viewmodel的字符串屬性。字符串屬性在viewmodel中更新,並通過綁定顯示文本框內的文本。WPF文本框綁定和換行

問題是,我想在字符串屬性中的一定數量的字符後插入換行符,我希望換行符顯示在文本框控件上。

我試圖附加\ r \ n的視圖模型的字符串屬性,但斷行內不會反映在文本框(我有Acceptsreturn屬性設置爲true的文本框內)

任何人可以幫助。

回答

3

我剛剛創建了一個簡單的應用程序,它可以完成您所描述的任務,並且可以爲我工作。

XAML:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <TextBox Grid.Row="0" AcceptsReturn="True" Height="50" 
      Text="{Binding Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <Button Grid.Row="1" Click="Button_Click">Button</Button> 
    </Grid> 
</Window> 

視圖模型:

class ViewModel : INotifyPropertyChanged 
{ 
    private string text = string.Empty; 
    public string Text 
    { 
     get { return this.text; } 
     set 
     { 
      this.text = value; 
      this.OnPropertyChanged("Text"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propName) 
    { 
     var eh = this.PropertyChanged; 
     if(null != eh) 
     { 
      eh(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 
} 

ViewModel一個實例被設置爲DataContextWindow。最後,Button_Click()實現如下:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    this.model.Text = "Hello\r\nWorld"; 
} 

(我意識到觀點實在不應該直接修改視圖模型的Text屬性,但是這僅僅是一個快速的示例應用程序。)

這將導致TextBox的第一行是「Hello」,第二行是「World」。

也許如果您發佈您的代碼,我們可以看到與此示例有什麼不同?

+0

謝謝安迪,我終於明白了這個問題。非常感謝您的支持。 – deepak 2009-07-14 12:40:34

6

我的解決方案是使用HTML編碼的換行符( )。

Line1&#10;Line2 

貌似

Line1 
Line2 

從直樹

0

我喜歡@Andy方法,它是完美的小文不與大和滾動文本。

視圖模型

class ViewModel :INotifyPropertyChanged 
{ 
    private StringBuilder _Text = new StringBuilder(); 
    public string Text 
    { 
     get { return _Text.ToString(); } 
     set 
     { 
      _Text = new StringBuilder(value); 
      OnPropertyChanged("Text"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propName) 
    { 
     var eh = this.PropertyChanged; 
     if(null != eh) 
     { 
      eh(this,new PropertyChangedEventArgs(propName)); 
     } 
    } 
    private void TextWriteLine(string text,params object[] args) 
    { 
     _Text.AppendLine(string.Format(text,args)); 
     OnPropertyChanged("Text"); 
    } 

    private void TextWrite(string text,params object[] args) 
    { 
     _Text.AppendFormat(text,args); 
     OnPropertyChanged("Text"); 
    } 

    private void TextClear() 
    { 
     _Text.Clear(); 
     OnPropertyChanged("Text"); 
    } 
} 

現在你可以使用TextWriteLine,TextWrite和TextClear在MVVM。