如何在WPF应用中更新文本框值?

时间:2019-06-18 10:00:17

标签: wpf observablecollection

我正在努力解决更新对象时文本框应如何自动更改其值。我有一个带有名称和值的温度类。

public class Temperature
{
    public string Name { get; set; }
    public double Value { get; set; }
}

在InitializeComponent()之后的MainWindow.xaml.cs中,我创建了一个     ObservableCollection _lstTempObs =新的ObservableCollection();然后添加一个初始温度对象。

在主窗口中,我有一个文本框

<TextBox x:Name="T1"  Text="{Binding Path=Value}" HorizontalAlignment="Left" Height="23" Margin="215,55,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>

然后在MainWindow.xaml.cs中,将datacontext设置为     T1.DataContext = _lstTempObs.LastOrDefault(); 温度更新来自API。当获得mew Temperature对象时,将其添加到ObservableCollection中,但在GUI中该值不变。

 public partial class MainWindow : Window
{
    ObservableCollection<Temperature> _lstTempObs = new ObservableCollection<Temperature>();
    public MainWindow()
    {
        InitializeComponent();
        _lstTempObs.Add(new Temperature { Name = "T1", Value = "0.321" });

        T1.DataContext = _lstTempObs.LastOrDefault();
    }
}

1 个答案:

答案 0 :(得分:0)

您需要实现一种通知机制,用于通知UI数据更改。 在WPF中,通常使用INotifyPropertyChanged接口完成此操作。 请查看此answer,以获得有关如何执行此操作的基本参考。

在实际情况下,我将在基类中实现INPC接口

public class INPCBase : INotifyPropertyChanged
{
    public bool SetField<U>(ref U field, U value, [CallerMemberName] string propertyName = null)
    {
        if (field == value))
        {
            return false;
        }

        field = value;
        OnPropertyChanged(propertyName);
        return true;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public virtual void OnPropertyChanged([CallerMemberName]string propertyName = "")
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }

} 

用法:

public class Temperature : INPCBase
{
    private string name;
    public string Name { get; set{base.SetField(ref name, value); } }

    private double val;
    public double Value { get; set{base.SetField(ref val, value); } }
}