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();

Все плохо. Не делай этого. Почти никогда не бывает хорошей идеей иметь более одного потока для пользовательского интерфейса.

Другие вопросы по тегам