0

そのため、リストビューに情報の行を追加しようとしていますが、そうすると奇妙に表示されます。そのようです:

ここに画像の説明を入力

次のように for each ループを使用しています。

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

1 に答える 1

2

このコードにはいくつかの誤りがあります。バインディングを使用して 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;
}

繰り返しますが、これは実際に行うべき方法ではありませんが、これが始まりです。たとえば、2 つの方法でバインディングを機能させたい場合、DummyClient は INotifyPropertyChanged を実装する必要があります。

于 2012-10-13T12:28:17.260 に答える