【问题标题】:Updating value of TextBlock in wpf dynamically [Sovled]动态更新 wpf 中 TextBlock 的值 [已解决]
【发布时间】:2016-07-20 09:21:39
【问题描述】:

我的 UI 上有文本块。我想在文本块上动态显示一些文本。我已经按照下面的代码实现了它。但是我没有看到动态更新的值。我只看到 UI 文本块上的最后更新值。我已经延迟通知更改。

请提供任何解决方案或评论以获取更多信息。在此先感谢您。

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>

【问题讨论】:

  • 代码以毫秒为单位执行......当然你只会 c 最后一个值。谷歌 wpf 绑定和延迟。你会在那里发现很多东西
  • 是的,我同意这一点,但即使有延迟,结果也是一样的。我尝试延迟 1 秒 2 秒来观察变化。
  • 请其他人回答。

标签: c# wpf mvvm inotifypropertychanged textblock


【解决方案1】:

您需要在后台线程中运行以更新 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));
    }
}

【讨论】:

  • 好朋友,谢谢。有用。你救了我的命:)
猜你喜欢
  • 1970-01-01
  • 2011-04-03
  • 2017-06-24
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多