C# 从其他线程绑定到DataGrid上的WPF更新列表&;等级

C# 从其他线程绑定到DataGrid上的WPF更新列表&;等级,c#,wpf,multithreading,binding,datagrid,C#,Wpf,Multithreading,Binding,Datagrid,答复: Application.Current.Dispatcher.Invoke((Action)(() => { logs.Add(this); })); 我尝试为我的服务器创建日志系统(log.cs) 我制作了这个课程日志: public class Log { public enum Flags { [Description("SERVER - OK")] OK, [Description("SERVER - E

答复:

  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();
    }
}
公共类日志
{
公共枚举标志
{
[说明(“服务器-正常”)]
好啊
[说明(“服务器错误”)]
错误
}
公共字符串EtatLog{get;set;}
公共字符串MessageLog{get;set;}
公共静态ObservableCollection日志=新ObservableCollection();
公共日志(标志、字符串消息)
{
EtatLog=GetEnumDescription(标志);
MessageLog=消息;
日志。添加(此);
}
私有字符串GetEnumDescription(枚举枚举值)
{
var fieldInfo=enumValue.GetType().GetField(enumValue.ToString());
var DescriptionAttribute=(DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute),false);
返回descriptionAttributes.Length>0?descriptionAttributes[0]。说明:enumValue.ToString();
}
}
我已将我的ObservableCollection绑定到数据网格上,如下所示:

<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>

现在这就是我的问题:我想创建一个服务器,所以我使用了很多线程来运行它(比如我的登录侦听器)。如果我有一个新的连接(用户),我想在我的列表中写一个日志,所以我这样做: 日志=新日志(Log.Flags.OK,“新公司…”)

但是,我使用多线程,因此我的datagrid无法更新,因为它在主线程上运行

我有一个错误(法语):


如何解决问题?

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

请使用调度程序

public Log(Flags flag, string message)
{
    EtatLog = GetEnumDescription(flag);
    MessageLog = message;
    this.Dispatcher.Invoke((Action)(() => {
        logs.Add(this);
    }
}
我不能使用“this”,因为它是“log.cs”类,而不是我的主窗口:/my error:Dispatcher dosent exist…你能使用“Application.Current.Dispatcher.Invoke()”吗?天哪,它能工作:)Thx dude!Application.Current.Dispatcher.Invoke((操作)(()=>{logs.Add(this);}));