当从DispatcherTimer.Tick添加时,c# ListBox不显示添加的项

本文关键字:添加 显示 ListBox DispatcherTimer Tick 当从 | 更新日期: 2023-09-27 17:53:21

这看起来像一个奇怪的行为对我来说,因为我不喜欢责怪别人,我花了几个小时试图解决这个问题-但我不明白这一点:

我刚刚注意到问题发生在DispatcherTimer调用的方法中。Tick事件。这可能是一个多线程问题

  1. 有一个列表框:

    <ListBox ItemsSource="{Binding ConfigurationErrors, Mode=OneWay}"/>
    
  2. 绑定到:

    private ObservableCollection<string> _configurationErrors = new ObservableCollection<string>();
    public ObservableCollection<string> ConfigurationErrors {
        get {
            return _configurationErrors;
        }
    }
    /// <summary>
    ///     Adds a configuration error to the window.
    /// </summary>
    /// <param name="ErrorMessage">The message to add.</param>
    public void AddConfigurationError(string ErrorMessage) {
        if(String.IsNullOrEmpty(ErrorMessage))
            return;
        _configurationErrors.Add(ErrorMessage);
        NotifyPropertyChanged("ConfigurationErrors");
    }
    /// <summary>
    ///     Removes all configuration errors from the window.
    /// </summary>
    public void ClearConfigurationErrors() {
        _configurationErrors.Clear();
        NotifyPropertyChanged("ConfigurationErrors");
    }
    

AddConfigurationError(string ErrorMessage)成功添加消息,如果它被称为
从任何地方在我的MainWindow
(从构造函数和其他任何地方)

  • 我也有一个不断循环的方法(由DispatcherTimer.Tick)中存储在我的App.cs中的实例,其中包含以下代码:

        //File exists
        if (configFilePath == null) {
            _mainWindow.AddConfigurationError("Could not retrieve the config filepath.");
            throw new InvalidDataException("Could not retrieve the config filepath.");
        } else if (!File.Exists(configFilePath)) {
            _mainWindow.AddConfigurationError("Could not find the config. (" + configFilePath + ")");
            throw new InvalidDataException("Could not find the config. (" + configFilePath + ")");
        }
    
  • 异常被抛出并且AddConfigurationError()被调用。我也可以记录传递给AddConfigurationError()的消息,它确实有效,但是-我的控件没有收到绑定更新

    这是因为DispatcherTimer。Tick在不同的线程中运行,绑定可能不像我编写的那样工作?我该怎么补救呢?

    提前感谢。

    当从DispatcherTimer.Tick添加时,c# ListBox不显示添加的项

    在适当的MainWindow实例上调用方法。您还没有展示如何创建_mainWindow,而是调用

    _mainWindow.AddConfigurationError(...);
    

    你应该调用

    ((MainWindow)Application.Current.MainWindow).AddConfigurationError(...);
    

    这对我有用。我使用MVVM,但我认为它应该从

    后面的代码工作
        public MainViewModel()
        {
            timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromSeconds(3);
            timer.Tick +=timer_Tick;
            timer.Start();
        }
        void timer_Tick(object sender, EventArgs e)
        {
            AddConfigurationError("err"); 
        }
    

    XAML代码
        <ListBox  ItemsSource="{Binding ConfigurationErrors}">
        </ListBox>
    

    你不能从另一个线程访问UI层,你需要做这样的事情

    yourList.Invoke((MethodInvoker)(() =>
    {
        //add new items here
    }));
    

    除了"yourList",你也可以使用你的mainform或者在主线程上运行的东西