Не удается добавить строки в WPF DataGrid в PowerShell

Я использую DataGrid из «WPF Toolkit» из PowerShell. Проблема в том, что я не могу добавлять новые строки с помощью графического интерфейса.

dialog.xaml

<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:sys="clr-namespace:System;assembly=mscorlib"
  xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WpfToolkit"
  >

  <Window.Resources>
    <x:Array x:Key="people" Type="sys:Object" />
  </Window.Resources>

  <StackPanel>
    <dg:DataGrid x:Name="_grid" ItemsSource="{DynamicResource people}" CanUserAddRows="True" AutoGenerateColumns="False">
      <dg:DataGrid.Columns>

        <dg:DataGridTextColumn Header="First" Binding="{Binding First}"></dg:DataGridTextColumn>
        <dg:DataGridTextColumn Header="Last" Binding="{Binding Last}"></dg:DataGridTextColumn>

      </dg:DataGrid.Columns>
    </dg:DataGrid>

    <Button>test</Button>
  </StackPanel>
</Window>

dialog.ps1

# Includes
Add-Type -AssemblyName PresentationFramework 
[System.Reflection.Assembly]::LoadFrom("C:\Program Files\WPF Toolkit\v3.5.40320.1\WPFToolkit.dll")

# Helper methods
function LoadXaml
{
    param($fileName)

    [xml]$xaml = [IO.File]::ReadAllText($fileName)
    $reader = (New-Object System.Xml.XmlNodeReader $xaml) 
    [Windows.Markup.XamlReader]::Load( $reader ) 
}

# Load XAML
$form = LoadXaml('.\dialog.xaml')

#
$john = new-object PsObject
$john | Add-Member -MemberType NoteProperty -Name "First" -Value ("John")
$john | Add-Member -MemberType NoteProperty -Name "Last" -Value ("Smith")

$people = @( $john )
$form.Resources["people"] = $people

#
$form.ShowDialog() 

run.bat

powershell -sta -file dialog.ps1

Проблема, похоже, в коллекции $ people. Я пробовал тот же код на C #, и он работал, но коллекция была определена следующим образом:

List<Person> people = new List<Person>();
people.Add(new Person { First = "John", Last = "Smith" });
this.Resources["people"] = people;

Также пробовал коллекцию Clr - вообще не вышло:

$people = New-Object "System.Collections.Generic.List``1[System.Object]"
$people.add($john)

Любые идеи?


person alex2k8    schedule 26.03.2009    source источник


Ответы (2)


Окончательное решение:

# Declare Person class
add-type @"
    public class Person
    {
        public Person() {}

        public string First { get; set; }
        public string Last { get; set; }
    }
"@ -Language CsharpVersion3

# Make strongly-typed collection
[System.Collections.ArrayList] $people = New-Object "System.Collections.ArrayList"

# 
$john = new-object Person
$john.First = "John"
$john.Last = "Smith"

$people.add($john)

$form.Resources["people"] = $people
person alex2k8    schedule 27.03.2009

[System.Collections.ArrayList] $people = New-Object "System.Collections.ArrayList"

Если вы должны передавать аргументы, вы должны сделать их строго типизированными, чтобы PowerShell не оборачивал их как PsObject.

Ссылка больше не работает

person alex2k8    schedule 27.03.2009
comment
Ссылка не работает; вот почему мы просим людей публиковать ответы, а не ссылки на ответы. - person Dour High Arch; 30.08.2019