2009-07-14 10 views
5

Ho una casella di testo che sto vincolando alla proprietà stringa di viewmodel. La proprietà stringa viene aggiornata all'interno di viewmodel e visualizza il testo all'interno della casella di testo tramite associazione.WPF Associazione di testo e interruzioni di riga

Il problema è che voglio inserire l'interruzione di riga dopo un determinato numero di caratteri nella proprietà stringa e voglio che l'interruzione di riga venga visualizzata sul controllo casella di testo.

ho cercato aggiungendo \ r \ n all'interno della proprietà stringa nel ViewModel, ma l'interruzione di riga non si riflette sopra la casella di testo (ho insieme di proprietà AcceptsReturn true all'interno del testo)

Qualcuno può aiutarmi.

risposta

3

Ho appena creato una semplice app che fa ciò che descrivi e ha funzionato per me.

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> 

ViewModel:

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

un'istanza di ViewModel è impostato come DataContext per la Window. Infine, la realizzazione di Button_Click() è:

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

(mi rendo conto che la vista non dovrebbe in realtà modificare direttamente la proprietà del ViewModel Text, ma questo è solo un'applicazione di esempio veloce.)

Il risultato è il parola "Ciao" sulla prima riga di TextBox e "Mondo" è sulla seconda riga.

Forse se pubblichi il tuo codice possiamo vedere cosa c'è di diverso da questo campione?

+0

Grazie Andy, ho capito il problema alla mia fine. Grazie mille per il vostro supporto. – deepak

6

La soluzione per me era utilizzare i feed di riga con codifica HTML ( ).

Line1&#10;Line2 

Sembra

Line1 
Line2 

Da Naoki

0

Mi piace @Andy Approach, è perfetto per il testo di piccole dimensioni non con testo di grandi dimensioni e scorrevole.

View Modello

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

Ora è possibile utilizzare TextWriteLine, TextWrite e TextClear nel vostro MVVM.