2017-12-28 11 views
-1

Ich habe ein Problem mit der Bindung von Daten von einem List<> zu einem Listview in WPF. Die Zeile ListView ist leer, aber die Listenwerte werden in List<> festgelegt. Wenn ich es mit einer ListBox mache, sehe ich die Werte in einer Zeile.C# wpf eine Liste an eine Listview binden - Listview Zeile ist leer

Blick auf den Code für die Liste:

public static List<string> ShowUSB() 
    { 
     var usbDevices = GetUSBDevices(); 
     List<string> Devices = new List<string>(); 
     foreach (var usbDevice in usbDevices) 
     { 
      string[] DeviceIDs = usbDevice.DevicePNPDeviceID.Split(new Char[] { '\\', '&', '_' }); 
      usbDevice.DeviceVID = DeviceIDs[2]; 
      usbDevice.DevicePID = DeviceIDs[4]; 

      Devices.Add(usbDevice.DeviceManufacturer + usbDevice.DeviceName + usbDevice.DeviceVID + usbDevice.DevicePID); 

     } 

     return Devices; 
    } 

Hier ist der XAML-Code für die Bindung:

<GroupBox Header="available Devices" Margin="1,223,1,75" SnapsToDevicePixels="True" Grid.ColumnSpan="2"> 
        <ListView x:Name="lvAddedDevices" Margin="0,0,0,0" > 
         <ListView.View> 
          <GridView> 
           <GridViewColumn x:Name="colManufacturer" Width="240" Header="Manufacturer" DisplayMemberBinding="{Binding DeviceManufacturer}"/> 
           <GridViewColumn x:Name="colDeviceName" Width="240" Header="Device Name" DisplayMemberBinding="{Binding DeviceName}"/> 
           <GridViewColumn x:Name="colPNPVID" Width="200" Header="VID ID" DisplayMemberBinding="{Binding DeviceVID}"/> 
           <GridViewColumn x:Name="colPNPPID" Width="200" Header="PID ID" DisplayMemberBinding="{Binding DevicePID}"/> 
           <!--<GridViewColumn x:Name="colDeviceStatus" Width="200" Header="Device Status"/>--> 
          </GridView> 
         </ListView.View> 
        </ListView> 

       </GroupBox> 

Und die Bindung Aufruf im Code hinter:

internal void LoadDevicesforList() 
    { 

     lvAddedDevices.ItemsSource = USBHandler.ShowUSB(); 
    } 

Hier ist die komplette Klasse:

public class USBHandler 
{ 

    public static List<string> ShowUSB() 
    { 
     var usbDevices = GetUSBDevices(); 
     List<string> Devices = new List<string>(); 
     foreach (var usbDevice in usbDevices) 
     { 
      string[] DeviceIDs = usbDevice.DevicePNPDeviceID.Split(new Char[] { '\\', '&', '_' }); 
      usbDevice.DeviceVID = DeviceIDs[2]; 
      usbDevice.DevicePID = DeviceIDs[4]; 

      Devices.Add(usbDevice.DeviceManufacturer + usbDevice.DeviceName + usbDevice.DeviceVID + usbDevice.DevicePID); 

     } 

     return Devices; 
    } 

    static List<USBDeviceInfo> GetUSBDevices() 
    { 
     List<USBDeviceInfo> devices = new List<USBDeviceInfo>(); 

     ManagementObjectCollection collection; 
     using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_PnpEntity where Manufacturer Like 'ATMEL%' or Manufacturer Like 'Microchip%' or Manufacturer Like 'Texas%' ")) 
      collection = searcher.Get(); 
     if (collection.Count > 0) 
     { 
      foreach (var device in collection) 
      { 

       devices.Add(new USBDeviceInfo(
       (string)device.GetPropertyValue("Manufacturer"), 
       (string)device.GetPropertyValue("Name"), 
       (string)device.GetPropertyValue("PNPDeviceID") 
       )); 

      } 
     } 

     collection.Dispose(); 
     return devices; 
    } 
} 

class USBDeviceInfo 
{ 
    public USBDeviceInfo(string deviceManufacturer, string deviceName, string devicePNPDeviceID) 
    { 
     DeviceManufacturer = deviceManufacturer; 
     DeviceName = deviceName; 
     DevicePNPDeviceID = devicePNPDeviceID; 
    } 
    public string DeviceManufacturer { get; private set; } 
    public string DeviceName { get; private set; } 
    public string DevicePNPDeviceID { get; private set; } 
    public string DeviceVID { get; set; } 
    public string DevicePID { get; set; } 
} 
+5

Wie erwarten Sie alle DisplayMemberBindings funktionieren, wenn die ItemsSource-Auflistungselemente nur Zeichenfolgen sind? Wahrscheinlich wollten Sie der ItemsSource-Eigenschaft eine 'List ' zuweisen. – Clemens

+0

Ich denke, wenn Sie diese Zeile ändern "Liste Devices = neue Liste ();' zu dieser 'Liste Devices = neue Liste ();' Sie werden mindestens auf dem richtigen Weg sein. – KSib

+0

Hallo, die Werte sind nur Strings :-( – Grizzly1969

Antwort

1

Ändern der ShowUSB Methode dazu:

public static List<USBDeviceInfo> ShowUSB() 
{ 
    var devices = GetUSBDevices(); 

    foreach (var device in devices) 
    { 
     var deviceIDs = usbDevice.DevicePNPDeviceID.Split('\\', '&', '_'); 
     device.DeviceVID = deviceIDs[2]; 
     device.DevicePID = deviceIDs[4]; 
    } 

    return devices; 
} 

Oder noch besser, das ganze Verfahren fallen und die USBDeviceInfo Konstruktor dies ändern:

public USBDeviceInfo(
    string deviceManufacturer, string deviceName, string devicePNPDeviceID) 
{ 
    DeviceManufacturer = deviceManufacturer; 
    DeviceName = deviceName; 
    DevicePNPDeviceID = devicePNPDeviceID; 

    var deviceIDs = devicePNPDeviceID.Split('\\', '&', '_'); 
    DeviceVID = deviceIDs[2]; 
    DevicePID = deviceIDs[4]; 
} 

dann die GetUSBDevices Methode öffentlich machen und direkt anrufen

+0

Vielen Dank Clemens, aber jetzt bekomme ich einen Compiler Fehler: 'Schweregrad Beschreibung Projekt Datei Zeile Unterdrückung Zustand Fehler CS0050 inkonsistenten Zugriff: Rückgabetyp" Liste "ist weniger zugänglich als die Methode" USBHandler.ShowUSB() ".' – Grizzly1969

+0

Machen Sie es' öffentliche Klasse USBDeviceInfo' – Clemens

+0

Hallo Clemens, jetzt habe ich Ihren Beitrag versucht, aber ich bekomme kein Mitglied in 'lvAddedDevices.ItemsSource = USBHandler.GetUSBDevices' – Grizzly1969