当从DispatcherTimer.Tick添加时,c# ListBox不显示添加的项
本文关键字:添加 显示 ListBox DispatcherTimer Tick 当从 | 更新日期: 2023-09-27 17:53:21
这看起来像一个奇怪的行为对我来说,因为我不喜欢责怪别人,我花了几个小时试图解决这个问题-但我不明白这一点:
我刚刚注意到问题发生在DispatcherTimer调用的方法中。Tick事件。这可能是一个多线程问题
-
有一个列表框:
<ListBox ItemsSource="{Binding ConfigurationErrors, Mode=OneWay}"/>
-
绑定到:
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在不同的线程中运行,绑定可能不像我编写的那样工作?我该怎么补救呢?
提前感谢。
在适当的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或者在主线程上运行的东西