繁体   English   中英

WPF更新列表从其他线程和类绑定到DataGrid

[英]WPF Update List binded on DataGrid from other Thread & Class

回答:

  Application.Current.Dispatcher.Invoke((Action)(() => { logs.Add(this); }));

我尝试为服务器创建日志系统(Log.cs)

我做了这个班级的日志:

public class Log
{
    public enum Flags
    {
        [Description("SERVER - OK")]
        OK,
        [Description("SERVER - ERROR")]
        ERROR
    }


    public string EtatLog { get; set; }
    public string MessageLog { get; set; }

    public static ObservableCollection<Log> logs = new ObservableCollection<Log>();

    public Log(Flags flag, string message)
    {
        EtatLog = GetEnumDescription(flag);
        MessageLog = message;

        logs.Add(this);
    }

    private string GetEnumDescription(Enum enumValue)
    {
        var fieldInfo = enumValue.GetType().GetField(enumValue.ToString());

        var descriptionAttributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);

        return descriptionAttributes.Length > 0 ? descriptionAttributes[0].Description : enumValue.ToString();
    }
}

我已经将ObservableCollection绑定到Datagrid上,如下所示:

<DataGrid x:Name="GridLogs" Margin="0,5,0,0" ItemsSource="{Binding}" AutoGenerateColumns="False" x:FieldModifier="public">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding EtatLog}" Header="ID du Logs"/>
        <DataGridTextColumn Binding="{Binding MessageLog}" Header="Message du Logs" Width="*"/>
    </DataGrid.Columns>
</DataGrid>

现在这是我的问题:我想创建一个服务器,因此我使用许多线程来运行它(例如我的Login Listener)。 如果我有一个新的连接(用户),我想在我的列表中写一个日志,所以我要这样做:

但是,我使用多线程,所以我的数据网格无法更新,因为它运行在主线程上...

我有此错误(法语):

在此处输入图片说明

我该如何解决我的问题?

您将需要允许主UI线程添加到集合中。

为此使用分派器

public Log(Flags flag, string message)
{
    EtatLog = GetEnumDescription(flag);
    MessageLog = message;
    this.Dispatcher.Invoke((Action)(() => {
        logs.Add(this);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM