c# - WPF C# : UI won't update with even thou OnPropertyChanged is triggered

标签 c# wpf user-interface

我不明白为什么即使在调试时我的 UI 也不会更新,我可以看到记录数变量已更新。我只是从数据库中检索数据,计算行数并显示它,它在窗口加载事件上工作正常,但是当我单击刷新按钮时,即使添加了新行,数字也不会更新。这是我的 XAML:

<TextBlock Name="numRecordsAnalyzed_TAtab" TextWrapping="Wrap" Margin="0,-1,369,0" Grid.RowSpan="2" Grid.Column="1"> 
                        <Run Text="Records Found: " Foreground="{StaticResource Foreground}" FontSize="14"/>
                        <Run Text="{Binding Numrecords}" Foreground="LightBlue" FontSize="14"/>
</TextBlock>

这是 C#:

    public partial class OpenTradesWindow : INotifyPropertyChanged
{
    private ScotiaTradeAnalyzerDb connection = null;
    ObservableCollection<TradesClass> collection;

    private int numOfrecords = 0;
    public event PropertyChangedEventHandler PropertyChanged;

    #region properties
    public class TradesClass
    {
        public DateTime TradeDate { get; set; }
        public TimeSpan TradeTime { get; set; }
        public DateTime? CloseDateTime { get; set; }
        public string ClientName { get; set; }
        public string CurPair { get; set; }
        public int Amnt { get; set; }
        public string Action { get; set; }
        public decimal ExecutedRate { get; set; }
    }

    public int Numrecords
    {
        get { return numOfrecords; }
        set
        {
            if (numOfrecords != value)
            {
                numOfrecords = value;
                OnPropertyChanged("Numrecords");
            }
        }
    }

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion

    public OpenTradesWindow(ScotiaTradeAnalyzerDb Connection)
    {
        InitializeComponent();
        this.WindowStartupLocation = WindowStartupLocation.Manual;
        this.connection = Connection;
    }

    private void OpenTradesLoaded(object sender, RoutedEventArgs e)
    {

        try
        {
            collection = new ObservableCollection<TradesClass>();

            var OpenTradesQuery = from qa in connection.QuickAnalyzerInputs
                                  where qa.TradeClosedDateTime == null && qa.TraderID == Environment.UserName
                                  select new TradesClass
                                  {
                                      TradeDate = qa.ClientTradedDate,
                                      TradeTime = qa.ClientTradedTime,
                                      CloseDateTime = qa.TradeClosedDateTime,
                                      ClientName = qa.ClientName,
                                      CurPair = qa.CurrencyPair,
                                      Amnt = qa.TradedAmount,
                                      Action = qa.Action,
                                      ExecutedRate = qa.ExecutedRate
                                  };


            if(OpenTradesQuery.Count() > 0)
            {
                numOfrecords = OpenTradesQuery.Count();
                DataContext = this;

                foreach (var item in OpenTradesQuery)
                {
                    collection.Add(item);
                }

                DG_openTrades.ItemsSource = collection;

            }
            else
            {
                MeBox.Show("You have no open trades.", "", MessageBoxButton.OK, MessageBoxImage.Error);
            }

        }
        catch
        {
            MeBox.Show("Error retrieving data.", "Database Error", MessageBoxButton.OK, MessageBoxImage.Error);

        }


    }

    private void RefreshClick(object sender, RoutedEventArgs e)
    {
        try
        {
            collection = new ObservableCollection<TradesClass>();

            var OpenTradesQuery = from qa in connection.QuickAnalyzerInputs
                                  where qa.TradeClosedDateTime == null && qa.TraderID == Environment.UserName
                                  select new TradesClass
                                  {
                                      TradeDate = qa.ClientTradedDate,
                                      TradeTime = qa.ClientTradedTime,
                                      CloseDateTime = qa.TradeClosedDateTime,
                                      ClientName = qa.ClientName,
                                      CurPair = qa.CurrencyPair,
                                      Amnt = qa.TradedAmount,
                                      Action = qa.Action,
                                      ExecutedRate = qa.ExecutedRate
                                  };


            if (OpenTradesQuery.Count() > 0)
            {
                updateNumRecords(OpenTradesQuery.Count());

                foreach (var item in OpenTradesQuery)
                {
                    collection.Add(item);
                }

                DG_openTrades.ItemsSource = collection;

            }
            else
            {
                MeBox.Show("You have no open trades.", "", MessageBoxButton.OK, MessageBoxImage.Error);
            }

        }
        catch
        {
            MeBox.Show("Error retrieving data.", "Database Error", MessageBoxButton.OK, MessageBoxImage.Error);

        }

    }

    private void updateNumRecords(int num)
    {
        numOfrecords = num;
    }

我尝试将 datacontext 置于初始化之下,但随后它显示为 0,因此我将其置于 Load 事件中的计数之下。为什么当我点击刷新按钮时 UI 不更新任何建议?

最佳答案

您正在更新支持属性,因此不会调用 Notify

numOfrecords

你需要更新

记录数

为什么有一个方法只是更新属性?
我会直接这样做。

Numrecords = OpenTradesQuery.Count();

如果你坚持更新支持属性,你可以
(但这就是集合的用途)

numOfrecords = OpenTradesQuery.Count();
NotifyPropertyChanged("Numrecords");

关于c# - WPF C# : UI won't update with even thou OnPropertyChanged is triggered,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22227750/

相关文章:

c# - 为什么 GDI 不允许我删除大图像?

jquery - 如果在某种横向或纵向模式下,如何提示用户旋转设备,类似于 GameInformer App

c# - 更改 foreach 迭代变量和 C# 与 C++/CLI 之间的实现差异

wpf - 附加依赖对象被销毁\断开连接时的垃圾收集

wpf - 如何在 ListView SelectedItem 中制作样式。?

c# - OnPropertyChange不会更新组合框

android - 如何在 Canvas 上绘制大量矩形并且性能良好?

python - 将 QPainterPath 简化为轮廓

c# - SoudPlayer一次又一次播放同一文件

c# - 带有 Html 编码的 JsonResult