从其他线程绑定到 DataGrid 的 WPF 更新列表 & Class
WPF Update List binded on DataGrid from other Thread & Class
答案:
Application.Current.Dispatcher.Invoke((Action)(() => { logs.Add(this); }));
我尝试为我的服务器创建一个日志系统 (Log.cs)
我做了这个 class 日志:
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>
现在这是我的问题:我想创建一个服务器,所以我使用很多线程 运行 它(比如我的登录监听器)。如果我有一个新的连接(用户),我想在我的列表中写一个日志,所以我这样做:
日志日志=新日志(Log.Flags.OK,"New co...");
但是,我使用多线程,所以我的数据网格无法更新,因为它 运行 在主线程上...
我有这个错误(法语):
我该如何解决我的问题?
您需要允许 UI 主线程添加到集合中。
为此使用 Dispatcher
public Log(Flags flag, string message)
{
EtatLog = GetEnumDescription(flag);
MessageLog = message;
this.Dispatcher.Invoke((Action)(() => {
logs.Add(this);
}
}
答案:
Application.Current.Dispatcher.Invoke((Action)(() => { logs.Add(this); }));
我尝试为我的服务器创建一个日志系统 (Log.cs)
我做了这个 class 日志:
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>
现在这是我的问题:我想创建一个服务器,所以我使用很多线程 运行 它(比如我的登录监听器)。如果我有一个新的连接(用户),我想在我的列表中写一个日志,所以我这样做: 日志日志=新日志(Log.Flags.OK,"New co...");
但是,我使用多线程,所以我的数据网格无法更新,因为它 运行 在主线程上...
我有这个错误(法语):
我该如何解决我的问题?
您需要允许 UI 主线程添加到集合中。
为此使用 Dispatcher
public Log(Flags flag, string message)
{
EtatLog = GetEnumDescription(flag);
MessageLog = message;
this.Dispatcher.Invoke((Action)(() => {
logs.Add(this);
}
}