Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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# 向包含列的listview行添加项_C#_Wpf_Listview - Fatal编程技术网

C# 向包含列的listview行添加项

C# 向包含列的listview行添加项,c#,wpf,listview,C#,Wpf,Listview,因此,我试图将一行信息添加到我的listview中,但当我这样做时,它会奇怪地显示出来。像这样: 我正在为每个循环使用一个,如下所示: foreach (Client c in clients) { ListViewItem i = new ListViewItem(); i.Content = new String[] { c.info.cid.ToString(), c.info.pc.ToString(),c.info.ip.ToString(), c.info.status

因此,我试图将一行信息添加到我的listview中,但当我这样做时,它会奇怪地显示出来。像这样:

我正在为每个循环使用一个,如下所示:

foreach (Client c in clients)
{
   ListViewItem i = new ListViewItem();
   i.Content = new String[] { c.info.cid.ToString(), c.info.pc.ToString(),c.info.ip.ToString(), c.info.status.ToString() };
   list.Items.Add(i);
}
我的客户端类正在使用结构来存储信息

public struct Info
{
  public int cid;
  public string pc;
  public string ip;
  public string status;
}
我也在为它增加价值:

info = new Info();
info.ip = "192.168.1.100";
info.pc = "Duncan";
info.status = "idle";
info.cid = 1;
为什么它会奇怪地显示出来?有人能帮忙吗

我的ListView XAML:

<ListView Height="247" HorizontalAlignment="Left" Margin="4,6,0,0" Name="list" VerticalAlignment="Top" Width="319" Background="#FF454545" ItemsSource="{Binding}" SelectionMode="Multiple" Grid.Column="0">
   <ListView.View>
       <GridView AllowsColumnReorder="False">
       <GridViewColumn Header="ID" Width="30" />
       <GridViewColumn Header="Computer" Width="100" />
       <GridViewColumn Header="IP" Width="100" />
       <GridViewColumn Header="Status" Width="100" />
       </GridView>
    </ListView.View>
    </ListView>

此代码中有一些错误的内容。如果要使用绑定在ListView中推送数据,则必须具有有效的ViewModel和要绑定的属性。必须在GridViewColumns上定义绑定

此外,WPF不知道如何绑定字段,因此您需要为每个要显示的数据使用.NET属性。这是一个非常原始的案例,这不是一个现实的场景,但应该可以帮助您开始:

Window.xaml

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<ListView Height="247" HorizontalAlignment="Left" Margin="4,6,0,0" Name="list" VerticalAlignment="Top" Width="319" Background="#FF454545" ItemsSource="{Binding Clients}" SelectionMode="Multiple" Grid.Column="0">
    <ListView.View>
        <GridView AllowsColumnReorder="False">
            <GridViewColumn Header="ID" Width="30" DisplayMemberBinding="{Binding Id}" />
            <GridViewColumn Header="Computer" Width="100" DisplayMemberBinding="{Binding Computer}" />
            <GridViewColumn Header="IP" Width="100" DisplayMemberBinding="{Binding Ip}" />
            <GridViewColumn Header="Status" Width="100" DisplayMemberBinding="{Binding Status}" />
        </GridView>
    </ListView.View>
</ListView>
</Window>

MainWindow.xaml.cs

/// <summary>
/// Logique d'interaction pour MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;           
    }

    public IEnumerable<DummyClient> Clients
    {
        get
        {
            for (int i = 0; i < 10; i++)
            {
                var info = new Info();
                info.ip = "192.168.1.100";
                info.pc = "Duncan";
                info.status = "idle";
                info.cid = 1;

                yield return new DummyClient(info);
            }
        }
    }
}

public class DummyClient
{
    public DummyClient(Info info)
    {
        Info = info;
    }

    public string Ip { get { return Info.ip; } }
    public string Computer { get { return Info.pc; } }
    public string Status { get { return Info.status; } }
    public int Id { get { return Info.cid; } }

    public Info Info
    {
        get;
        private set;
    }
}

public struct Info
{
    public int cid;
    public string pc;
    public string ip;
    public string status;
}
//
///Logique d'interaction pour main window.xaml
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
DataContext=this;
}
公共IEnumerable客户端
{
得到
{
对于(int i=0;i<10;i++)
{
var info=新信息();
info.ip=“192.168.1.100”;
info.pc=“邓肯”;
info.status=“空闲”;
info.cid=1;
收益返回新DummyClient(信息);
}
}
}
}
公共类DummyClient
{
公共DummyClient(信息)
{
信息=信息;
}
公共字符串Ip{get{return Info.Ip;}}
公共字符串计算机{get{return Info.pc;}}
公共字符串状态{get{return Info.Status;}}
public int Id{get{return Info.cid;}}
公共信息
{
得到;
私人设置;
}
}
公共结构信息
{
公共国际cid;
公共字符串pc;
公共字符串ip;
公共字符串状态;
}

再一次,这不是真正应该做的事情,但这是一个开始。例如,如果您希望通过两种方式绑定工作,DummyClient应该实现INotifyPropertyChanged。

只是一个建议,您不需要对
字符串类型的变量使用
.ToString()
。那么如何将tiems绑定到列表?您绑定到一个对象集合。您不必手动创建ListViewItems,ListView项目生成器会为您执行此操作。在本例中,我将ListView ItemsSource绑定到基本DummyClient集合上。您可以将此代码转储到一个新项目中,并根据您的需要对其进行调整,它应该可以工作。对不起,请您详细说明一下,我有点困惑。好的:)ListView的DataContext是主窗口。它是将用作绑定源的对象。窗口构造函数中的“DataContext=This;”语句确保了这一点(顺便说一下,这不是一个好的实践)。现在在xaml中,ListView的ItemsSource设置为{Binding Clients}。这意味着ListView将在主窗口的Clients集合中填充对象。因此,如果要向ListView添加项,只需向该集合添加对象即可。最后,每列都绑定到DummyClient对象的特定属性:这由xaml中的GridViewColumn DisplayMemberBinding属性确保。祝你好运编辑:很高兴我能帮上忙。