Werte eines Controls updaten

andralin

Erfahrenes Mitglied
Hallo Leute,

nun bin ich bei WPF und Lernen angelangt und komme gleich am Anfang nicht weiter.

Das designen klappt, aber Code Behind noch nicht und bei meinem aktuellen Problem hab ich auch nix im Internet oder Büchern geunfden.

Es geht mir um aktualisieren ovn Feld Inhalten auf einer Form.

XAML Code:
Code:
<TextBlock      
     x:Name="txtText"
     Grid.Row="1"
     Margin="10"
     Padding="10"                
>
     Start-Text!
</TextBlock>

Code-behind:
Code:
for (i = 0; i < 2; i++)
{
     txtText.Text += i.ToString();
     Thread.Sleep(250);
}

Wie kann ich bei jedem Durchlauf den Feldinhalt aktualisieren? In meinem Beispiel wird der Inhalt erst nach dem letzten Schleifendurchlauf aktualisiert.

LG Andralin
 
Das ist, soweit ich weiß, in WPF nicht mehr so einfach möglich, wie in WinForms.

Schau dir doch einfach mal das an. Vielleicht hilft es dir ja. :)
 
So muss für ein funktionierendes DataBinding dein XAML aussehen:

Code:
    <Window ... DataContext="{Binding RelativeSource={RelativeSource Self}}" >
    <Grid>
          <TextBlock x:Name="txtText" Text="{Binding Path=Inhalt}" />
...

Und so dein Code:

Code:
          public string Inhalt { get; set; }

          private void ...
          {
               for (int i = 0; i < 2; i++)
               {
                    Inhalt += i.ToString();
                    txtText.GetBindingExpression(TextBlock.TextProperty).UpdateTarget();
                    Thread.Sleep(250);
               }
          }

Du brauchst im Code eine Eigenschaft, an die du den Wert des TextBlocks binden kannst. Über die Zeile in der Mitte der Schleife zwingst du den TextBlock quasi, dass er nochmal reinschaut, welcher Wert denn jetzt drinsteht.

Alternativ kannst du das aber auch so machen:

Code:
using System.ComponentModel;

namespace WpfApplication1
{
      public partial class Window1 : Window, INotifyPropertyChanged
     {
          public Window1()
          {
               InitializeComponent();
          }

          private string _inhalt;
          public string Inhalt
          {
               get { return _inhalt; }
               set
               {
                    _inhalt = value;
                    PropertyChanged(this, new PropertyChangedEventArgs("Inhalt"));                         
               }
          }

          private void Button_Click(object sender, RoutedEventArgs e)
          {
               for (int i = 0; i < 2; i++)
               {
                    Inhalt += i.ToString();
                    Thread.Sleep(250);
               }
          }

          public event PropertyChangedEventHandler PropertyChanged;
     }
}

Das untere ist eigentlich das Standard-Vorgehen. Du implementierst das Interface INotifyPropertyChanged aus System.ComponentModel, und die Steuerelemente werden automatisch aktualisiert, wenn der Wert der Eigenschaft sich ändert.
 
Lösung habe ich mit folgendem Konstrukt gefunden:

Code:
myTxtBlock.Dispatcher.Invoke(
     System.Windows.Threading.DispatcherPriority.Render,
     new System.Threading.ThreadStart(delegate {   })
);
 
Zurück