WPF: этот тип CollectionView не поддерживает ошибку изменений
Так что я WPF
приложение, и я хочу добавить Logger form
,
Поэтому я создаю еще один form
:
public partial class LoggerForm : MetroWindow
{
public LoggerForm()
{
InitializeComponent();
DataContext = LogHelper.LogEntries;
lvLogger.ItemsSource = LogHelper.LogEntries;
}
public void AddRandomEntry(LogEntry logEntry)
{
Dispatcher.BeginInvoke((Action)(() => LogHelper.LogEntries.Add(logEntry)));
}
}
XAML ListView
:
<ListView Name="lvLogger"
Background="#181818"
Margin="0,0,0,0">
<ListView.View>
<GridView>
<GridViewColumn Width="Auto" Header="Time" DisplayMemberBinding="{Binding DateTime}"/>
<GridViewColumn Width="Auto" Header="Index" DisplayMemberBinding="{Binding Index}"/>
<GridViewColumn Width="Auto" Header="Level" DisplayMemberBinding="{Binding Level}"/>
<GridViewColumn Width="Auto" Header="Source" DisplayMemberBinding="{Binding Source}"/>
<GridViewColumn Width="Auto" Header="Message" DisplayMemberBinding="{Binding Message}"/>
</GridView>
</ListView.View>
</ListView>
Журнал object
:
public class LogEntry
{
public string DateTime { get; set; }
public int Index { get; set; }
public string Source{ get; set; }
public Level Level { get; set; }
public string Message { get; set; }
}
Список:
public class LogHelper
{
public static ObservableCollection<LogEntry> LogEntries { get; set; }
}
Так вот как я могу добавить логин в свой список:
Откройте мой Logger form
:
Thread newWindowThread = new Thread(new ThreadStart(() =>
{
// Create and show the Window
loggerForm = new LoggerForm();
loggerForm.Show();
// Start the Dispatcher Processing
Dispatcher.Run();
}));
// Set the apartment state.
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
И из моего основного form
я создаю LogEntry
объект и я добавляю его:
private void AddLog(Level level, string message)
{
if (loggerForm != null)
{
LogEntry logEntry = new LogEntry()
{
DateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff"),
Index = LogHelper.LogEntries.Count,
Level = level,
Source = "bla bla",
Message = message
};
loggerForm.AddRandomEntry(logEntry);
}
}
Так что это работает нормально, пока я не закрою Logger
сформировать и открыть его снова. На данный момент, если я добавлю еще LogEntry
, У меня есть это error
в AddRandomEntry
метод:
System.NotSupportedException: 'Этот тип CollectionView не поддерживает изменения в его SourceCollection из потока, отличного от потока Dispatcher.'
1 ответ
Ваша проблема связана с вашими отдельными темами. Мой совет: не начинать новую тему вообще.
Thread newWindowThread = new Thread(new ThreadStart(() =>
а также
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
Все плохо. Не делай этого. Почти никогда не бывает хорошей идеей иметь более одного потока для пользовательского интерфейса.