【发布时间】:2014-09-08 10:53:49
【问题描述】:
我尝试将字符串数组中的字符串添加到 ObservableCollection。
我的做法是:
在我的构造函数中,我实例化集合并添加事件处理程序以调用我的方法,该方法将字符串从数组添加到列表:
public CLoggerViewModel()
{
this._currenLogContent = new ObservableCollection<string>();
this._memoryAppender.LogContentChanged += new LoggingEventHandler(OnLogContentChanged);
}
在事件处理程序中,我想遍历字符串数组并将每个字符串添加到集合中:
public void OnLogContentChanged(object sender, LoggingEventArgs e)
{
string[] tmpString = { "A", "B", "C", "D" };
foreach (string s in tmpString)
{
_currenLogContent.Add(s);
}
}
在我的论点中
e.LogEntries
它保存了我的字符串数组,我总是拥有我期望的所有字符串。 为简单起见/测试,我不使用从参数中获得的数组并用 A,B,C,D 实例化它,因为我被要求以可以在此处验证的方式更改它。
我的问题是总是只有数组的第一个字符串会被添加到我的 ObservableCollection 中。 一旦添加了第一个字符串,我的 foreach 迭代似乎就被终止了。
编辑:
在我的 WPF XAML 文件中,如果我的 ObservableCollection 绑定到以下列表框:
<ListBox Name="listViewLog" ItemsSource="{Binding LoggerViewModel.CurrentLogContent,UpdateSourceTrigger=PropertyChanged}" Margin="0,0,-248,-377" Grid.ColumnSpan="2" RenderTransformOrigin="0.586,0.51" Height="367" VerticalAlignment="Bottom" />
如果我删除绑定到我的 Observablecollection 的列表框,它将遍历 foreachloop。所以列表框或从列表框到我的集合的绑定导致迭代停止。我已经尝试使用所有 UpdateSourceTrigger 选项(Default、Explicit、LostFocus、PropertyChanged)。 但在所有情况下,它都会在第一轮之后停止迭代。
为了避免停止向 Observablecollection 添加字符串,我还需要在 ListBox 属性中设置什么吗?
编辑:
我发现对我有用的唯一解决方案是将要添加到集合中的字符串包装在单独的类中,然后将对象添加到列表中。在这种情况下,如果我将对象添加到列表中,它不会破坏我的 foreach 循环。
public void OnLogContentChanged(object sender, LoggingEventArgs e)
{
string[] tmpString = { "A", "B", "C", "D" };
foreach (string s in tmpString)
{
this.LogEntries.Add(new CLogEntry(s));
}
}
CLogEntry 只是一个暴露单个字符串的包装器。
使用这种解决方法它可以工作,但是,如果我“直接”将字符串添加到 Observablecollection,我仍然无法理解为什么它不起作用。
【问题讨论】:
-
您确定迭代停止了吗?还是您只看到
_currenLogContent中的第一项?你在调试器中单步执行了吗? -
@Avner:是的,我通过了它。一旦 OnLogContentChanged 被调用,它只会在 foreach 循环中迭代一次。即使 tmpString[] 中有 40 个条目。
-
等等,
tmpString[]是什么?它不在您显示的代码中。 -
@Patrick Hofman:我希望我的编辑有助于使其更具可复制性。
-
@Avner:我更改了它,因为它似乎不可复制。出于这个原因,我添加了这个 string[] tmpString = { "A", "B", "C", "D" };希望让它更具可复制性。但问题还是一样。
标签: c# wpf data-binding foreach observablecollection