从DispatcherTimer.Tick添加时,C#ListBox未显示添加的项目

时间:2015-06-04 07:05:41

标签: c# wpf binding timer listbox

这看起来像是一种奇怪的行为,因为我不喜欢责怪别人而不是我自己花了几个小时试图解决这个问题 - 但我根本不理解这一点:

我刚刚发现问题出现在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");
    }
    
  3. AddConfigurationError(string ErrorMessage)成功添加了一条消息,如果它被称为
    来自MainWindow 的任何位置。
    (来自构造函数和其他任何地方)

    1. 我还有一个不断循环的方法(由 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 + ")");
          }
      
    2. 正在抛出异常并且正在调用AddConfigurationError()。我也可以记录传递给AddConfigurationError()的消息,但它确实有效,但是我的控件没有收到绑定更新。

      这是因为DispatcherTimer.Tick在不同的线程中运行,并且绑定可能无法像我预期的那样按预期工作吗?我该如何解决?

      提前谢谢。

3 个答案:

答案 0 :(得分:1)

在正确的MainWindow实例上调用方法。您尚未展示如何创建_mainWindow,而是调用

_mainWindow.AddConfigurationError(...);

你应该致电

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

答案 1 :(得分:0)

这对我有用。我使用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>

答案 2 :(得分:-1)

您无法从需要执行此类操作的其他线程访问UI图层

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

而不是&#34; yourList&#34;你也可以使用你的主变形或在主线上运行的东西