Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试在datagrid中显示数据列表_C#_Wpf_Data Binding_Wpfdatagrid - Fatal编程技术网

C# 尝试在datagrid中显示数据列表

C# 尝试在datagrid中显示数据列表,c#,wpf,data-binding,wpfdatagrid,C#,Wpf,Data Binding,Wpfdatagrid,我试图在WPF数据网格中显示一个数据列表,因为一个textblock只是将数据聚合在一起,没有任何格式(这是我希望为我完成此数据的格式设置) 这就是背后的代码 public void OnMessageReceived(object sender, MessageReceivedEventArgs e) { try { if (e == null) return; if (e.CmsData != null)

我试图在WPF数据网格中显示一个数据列表,因为一个textblock只是将数据聚合在一起,没有任何格式(这是我希望为我完成此数据的格式设置)

这就是背后的代码

public void OnMessageReceived(object sender, MessageReceivedEventArgs e)
{
    try
    {
        if (e == null)
            return;

        if (e.CmsData != null)
        {
            List<string> mylist = new List<string>();
            foreach (var item in e.CmsData.Agents)
            {
                mylist.Add(item.AgName);
                mylist.Add(item.AuxReasonDescription);
            }
            Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() =>
            {
                this.datagrid.ItemsSource = mylist;
            }));
        }
    }
}
messagereceived上的public void(对象发送方,MessageReceivedEventArgs e)
{
尝试
{
如果(e==null)
返回;
如果(e.CmsData!=null)
{
List mylist=新列表();
foreach(e.CmsData.Agents中的var项)
{
mylist.Add(item.AgName);
mylist.Add(item.AuxReasonDescription);
}
Dispatcher.BeginInvoke(DispatcherPriority.Normal,(操作)(()=>
{
this.datagrid.ItemsSource=mylist;
}));
}
}
}
我用来填充数据网格的XAML

<Grid Height="100" Width="178.201">
    <DataGrid AutoGenerateColumns="True" ItemsSource="{Binding Path=mylist, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"   x:Name="datagrid" Background="{x:Null}" Loaded="textBlock_Loaded"/>
</Grid>

这是agents.cs文件,其中包含变量,我正试图将其拉入数据网格,以备需要

public class Agent : IEquatable<Agent>
{
    public int Extension { get; set; }
    public int WorkModeDirection { get; set; }
    public string WorkModeDirectionDescription { get; set; }
    public TimeSpan AgTime { get; set; }
    public int AuxReason { get; set; }
    public string AuxReasonDescription { get; set; }
    public int DaInQueue { get; set; }
    public int WorkSkill { get; set; }
    public int OnHold { get; set; }
    public int Acd { get; set; }
    public String LoginId { get; set; }
    public string AgName { get; set; }
    public int EId { get; set; }
    public int Preference { get; set; }
    public DateTime DateTimeCreated { get; set; }
    public DateTime DateTimeUpdated { get; set; }
    public int CmId { get; set; }
    #region Implementation of IEquatable<Agent>

    public bool Equals(Agent other)
    {
        if (ReferenceEquals(null, other))
            return false;

        if (ReferenceEquals(this, other))
            return true;

        return (other.LoginId == LoginId & other.CmId == CmId);
    }

    #endregion

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj))
            return false;

        if (ReferenceEquals(this, obj))
            return true;

        if (obj.GetType() != typeof(Agent))
            return false;

        return Equals((Agent)obj);
    }

    //public override int GetHashCode()
    //{
    //    return LoginId;
    //}
    public override int GetHashCode()
    {
        string combinedNumber = "" + CmId + LoginId;
        int hash = Convert.ToInt32(combinedNumber);
        return hash;
    }

    public static bool operator ==(Agent left, Agent right)
    {
        return Equals(left, right);
    }

    public static bool operator !=(Agent left, Agent right)
    {
        return !Equals(left, right);
    }

    public override string ToString()
    {
        return " Ag: [Ext:" + Extension + " login:" + LoginId + " AgName:" + AgName + " CmId:" + CmId + "]";
    }
    public bool IsValid()
    {
        return LoginId != null;
    }
}

公共类代理:IEquatable

您试图将DataGrid绑定到一个毫无意义的字符串列表。列表中绑定到DataGrid的每个项都应该表示网格中的一行

由于您试图在每一行上显示单个代理数据,因此应该直接绑定到代理列表

试试这个

public void OnMessageReceived(object sender, MessageReceivedEventArgs e)
        {
            try
            {
                if (e == null)
                    return;

                if (e.CmsData != null)
                {
                    Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() =>
                    {                        
                        this.datagrid.ItemsSource = e.CmsData.Agents;
                    }));                    
                    }
            }

但请记住,这将为代理对象的每个公共属性生成列。要指定要显示的列,请检查另一个SO问题的答案:

您应该将
数据网格的
项资源设置为
列表:

…并为要在XAML标记的
DataGrid
中显示的
Agent
类的每个属性定义一列:

<DataGrid AutoGenerateColumns="False" 
                      x:Name="datagrid" Background="{x:Null}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="AgName" Binding="{Binding AgName}" />
        <DataGridTextColumn Header="AuxReasonDescription" Binding="{Binding AuxReasonDescription}" />
    </DataGrid.Columns>
</DataGrid>


您正在尝试将datagrid绑定到字符串列表。这没有道理。您是否尝试每行显示一个代理对象?是的,我希望第一列是代理名称,第二列是agentuxDescription,依此类推,对于我尝试添加的其他可用变量。我已经用一个textblock和一个richtextblock试过了,但失败得很惨。一位同事建议我试试这个。相反,将你的项目作为一个对象,并将其添加到observable集合中,并将其与datagrid ItemSource绑定。我相信这对我来说是最好的,但在你更改代码后,你在答案中发布的XAML似乎不正确。datagrid仍然绑定到mylist,即使代码示例中不再存在mylist。这是正确的吗?或者在这种情况下,datagrid应该绑定到什么?是的,如果在OnMessageReceived方法中以编程方式设置ItemsSource,则可以摆脱ItemsSource绑定。我编辑了我的答案来澄清这一点。谢谢。我想这就是我要走的路线。我对这个datagrid有很多问题,到目前为止我不喜欢它,但与其他选项相比,它以最好的方式显示信息。我可以问一下,如果您正在尝试实现这一点,您还会使用datagrid或其他东西吗?尝试实现什么?是否显示数据的表格列表?如果我想编辑数据,我会使用DataGrid。否则我会使用ListView。如果我想尝试使用ListView查看它的外观,我会用与datagrid相同的方法进行数据绑定吗?我不打算让用户编辑此数据。
<DataGrid AutoGenerateColumns="False" 
                      x:Name="datagrid" Background="{x:Null}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="AgName" Binding="{Binding AgName}" />
        <DataGridTextColumn Header="AuxReasonDescription" Binding="{Binding AuxReasonDescription}" />
    </DataGrid.Columns>
</DataGrid>