【问题标题】:How should I update a textbox value in a WPF app?我应该如何更新 WPF 应用程序中的文本框值?
【发布时间】:2019-06-18 10:00:17
【问题描述】:

我很难解决当对象更新时文本框应如何自动更改其值的问题。我有一个带名称和值的温度类。

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

在 InitializeComponent() 之后的 MainWindow.xaml.cs 中,我创建了一个 ObservableCollection _lstTempObs = new 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。当我得到新的温度对象时,我将它添加到 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();
    }
}

【问题讨论】:

  • 当您似乎只想显示最后一个元素时,ObservableCollection 的目的是什么?

标签: wpf observablecollection


【解决方案1】:

您需要实现一种通知机制,通知 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); } }
}

【讨论】:

  • 我不确定您的回答为什么被否决。对于不了解 inpc 的初学者来说,您的代码可能有点复杂,您至少可以提供一个指向 msdn 上没有相等比较器的简单实现的链接。 (FWIW 我赞成)
  • @SanchoPanza 也不知道为什么。我赞成你的回答和评论,因为它低于 0。我也认为它可能有点复杂,也许只是保留重要的东西,比如实现 INotifyPropertyChanged 以及你需要实现什么等因为一些代码似乎不是问题中的部分代码。
  • 感谢您的输入 (@Andy/@pm101) 我试图简化代码并使其专注于 OP 问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多