2016-07-20 130 views
-2

私のUIにテキストブロックがあります。テキストブロックにテキストを動的に表示したいと思います。私は以下のコードに示すように実装しました。しかし、私は動的に値を更新表示されません。 UIテキストブロックの最後の更新された値のみが表示されます。私は変更に気づくために遅れを含めました。wpfでTextBlockの値を動的に更新しました[Sovled]

詳細については、任意の解決策やコメントをご提供ください。事前に感謝します。

Code: 

namespace TxtBlock 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     SomeObjectClass obj = new SomeObjectClass(); 

     public MainWindow() 
     { 
      InitializeComponent(); 

      txtName.DataContext = obj; 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      obj.Name = "Hello World"; 

      Thread.Sleep(2000); 
      obj.Name = "Third"; 
     } 

    } 

    class SomeObjectClass : INotifyPropertyChanged 
    { 
     private string _name = "hello"; 
     public string Name 
     { 
      get 
      { 
       return _name; 
      } 
      set 
      { 
       _name = value; 
       OnPropertyChanged("Name"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     public void OnPropertyChanged(string PropertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); 
     } 
    } 

} 

XAML: <Window x:Class="TxtBlock.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Button Content="Button" HorizontalAlignment="Left" Margin="237,170,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/> 
     <TextBlock HorizontalAlignment="Left" Margin="237,256,0,0" TextWrapping="Wrap" x:Name="txtName" Text="{Binding Name}" VerticalAlignment="Top"/> 

    </Grid> 
</Window> 
+0

コードが...ミリ秒単位で実行ofcourseのuの意志だけ最後の値C。 Google wpfバインディングと遅延あなたはそこに多くの問題を見つけるでしょう – Akanksha

+0

ええ、私はそれに同意しますが、結果は遅延でも同じです。私は変更を観察するために1秒2秒の遅延で試しました。 – Sagar

+0

他の人にはお答えください。 – Sagar

答えて

0

あなたはUIのTextBlockに値を更新するために、バックグラウンドスレッドで実行する必要が

コード:

public partial class TextBlockExample : Window 
{ 
    ThreadExampleViewModel viewModel = new ThreadExampleViewModel(); 

    public TextBlockExample() 
    { 
     InitializeComponent(); 
     this.DataContext = viewModel; 
    } 

    private void btnClick_Click(object sender, RoutedEventArgs e) 
    { 
     /// Background thread Thread to run your logic 
     Thread thread = new Thread(YourLogicToUpdateTextBlock); 
     thread.IsBackground = true; 
     thread.Start(); 
    } 

    private void YourLogicToUpdateTextBlock() 
    { 
     /// Example i am updating with i value. 
     for (int i = 0; i < 1000; i++) 
     { 
      viewModel.Name = i + " Conut"; 
      Thread.Sleep(1000); 
     } 
    } 
} 



<Grid> 
    <StackPanel> 
     <TextBlock x:Name="txtName" Text="{Binding Name}" Height="30" Width="100" Margin="10"/> 
     <Button x:Name="btnClick" Content="Click" Height="30" Width="100" Margin="10" Click="btnClick_Click"/> 
    </StackPanel> 
</Grid> 




public class ThreadExampleViewModel : INotifyPropertyChanged 
{ 

    private string name = "Hello"; 

    public string Name 
    { 
     get { return name; } 
     set { name = value; OnPropertyChanged("Name"); } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string PropertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); 
    } 
} 
+0

恐ろしい仲間、ありがとう。できます。あなたは私の命を救いました :) – Sagar

関連する問題