Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.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
PowerShell WPF-将DataGrid组合框绑定到ItemsSource中的列_Wpf_Powershell_Data Binding_Combobox_Datagrid - Fatal编程技术网

PowerShell WPF-将DataGrid组合框绑定到ItemsSource中的列

PowerShell WPF-将DataGrid组合框绑定到ItemsSource中的列,wpf,powershell,data-binding,combobox,datagrid,Wpf,Powershell,Data Binding,Combobox,Datagrid,我试图用给定列中的唯一值填充DataGrid中的组合框,但是我得到了意外的结果,因为它将该行中的值拆分为单个字符,并用所述字符填充每个组合框 下面是我的问题的一个简单示例脚本 $csv = "ID,Fruit,Owner`r`n" $csv += "1,Apple,Andrew`r`n" $csv += "2,Banana,Bill`r`n" $csv += "3,Cherry,Charles`r`n" $csv += "4,Date,Daniel`r`n" $csv += "5,Elderbe

我试图用给定列中的唯一值填充DataGrid中的组合框,但是我得到了意外的结果,因为它将该行中的值拆分为单个字符,并用所述字符填充每个组合框

下面是我的问题的一个简单示例脚本

$csv = "ID,Fruit,Owner`r`n"
$csv += "1,Apple,Andrew`r`n"
$csv += "2,Banana,Bill`r`n"
$csv += "3,Cherry,Charles`r`n"
$csv += "4,Date,Daniel`r`n"
$csv += "5,Elderberry,Ethan`r`n"

$data = ConvertFrom-Csv $csv

$inputXML = @"
<Window x:Name="DataGridComboTest" x:Class="DataGridComboTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DataGridComboTest" Width="640" Height="480" WindowStartupLocation="CenterScreen">
    <Grid>
        <DataGrid x:Name="DataGrid" Margin="10,10,10,10" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding ID}" Header="ID"/>
                <DataGridTextColumn Binding="{Binding Fruit}" Header="Fruit"/>
                <DataGridTextColumn Binding="{Binding Owner}" Header="Owner"/>

                <DataGridTemplateColumn Header="Owner Combo">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox
                                SelectedItem="{Binding Path=Owner, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                ItemsSource="{Binding Owner}"
                                Text="{Binding Path=Owner, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                            </ComboBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
"@

$inputXML = $inputXML -replace 'mc:Ignorable="d"','' -replace "x:N",'N'  -replace '^<Win.*', '<Window'
[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
[xml]$XAML = $inputXML

$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Form=[Windows.Markup.XamlReader]::Load( $reader )
$xaml.SelectNodes("//*[@Name]") | %{ Set-Variable -Name "$($_.Name)" -Value $Form.FindName($_.Name) -ErrorAction Stop }

$DataGrid.ItemsSource = $data

$Form.ShowDialog() | Out-Null
$csv=“ID、水果、所有者`r`n”
$csv+=“1,苹果,安德鲁`r`n”
$csv+=“2,香蕉,比尔`r`n”
$csv+=“3,Cherry,Charles`r`n”
$csv+=“4,日期,Daniel`r`n”
$csv+=“5,接骨木,Ethan`r`n”
$data=从Csv转换为$Csv
$inputXML=@”
"@

$inputXML=$inputXML-replace'mc:Ignorable=“d”、'-replace“x:N”、'N'-replace'^您应该将
ItemsSource
绑定到
IEnumerable
而不是标量
字符串(它是
IEnumerable

试着这样做:

...
ItemsSource="{DynamicResource owners}"
...

$owners = $data | Select-Object -ExpandProperty Owner -Unique
$Form.Resources.Add("owners", $owners)
在他的帮助下,我想出了一个工作脚本

$csv = "ID,Fruit,Owner`r`n"
$csv += "1,Apple,Andrew`r`n"
$csv += "2,Banana,Bill`r`n"
$csv += "3,Cherry,Charles`r`n"
$csv += "4,Date,Daniel`r`n"
$csv += "5,Elderberry,Ethan`r`n"
$csv += "6,Fig,Bill`r`n"
$csv += "7,Grape,Daniel`r`n"

$data = ConvertFrom-Csv $csv

$inputXML = @"
<Window x:Name="DataGridComboTest" x:Class="DataGridComboTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DataGridComboTest" Width="640" Height="480" WindowStartupLocation="CenterScreen">
    <Grid>
        <DataGrid x:Name="DataGrid" Margin="10,10,10,10" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding ID}" Header="ID"/>
                <DataGridTextColumn Binding="{Binding Fruit}" Header="Fruit"/>
                <DataGridTextColumn Binding="{Binding Owner}" Header="Owner"/>

                <DataGridTemplateColumn Header="Owner Combo">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox
                                SelectedItem="{Binding Path=Owner, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                ItemsSource="{DynamicResource owners}"
                                Text="{Binding Path=Owner, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                            </ComboBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
"@

$inputXML = $inputXML -replace 'mc:Ignorable="d"','' -replace "x:N",'N'  -replace '^<Win.*', '<Window'
[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
[xml]$XAML = $inputXML

$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Form=[Windows.Markup.XamlReader]::Load( $reader )
$xaml.SelectNodes("//*[@Name]") | %{ Set-Variable -Name "$($_.Name)" -Value $Form.FindName($_.Name) -ErrorAction Stop }

$DataGrid.ItemsSource = $data

#$owners = [Linq.Enumerable]::ToArray($data | Select-Object -ExpandProperty Owner)
$owners = $data | Select-Object -ExpandProperty Owner -Unique
$Form.Resources.Add("owners", $owners)

$Form.ShowDialog() | Out-Null
$csv=“ID、水果、所有者`r`n”
$csv+=“1,苹果,安德鲁`r`n”
$csv+=“2,香蕉,比尔`r`n”
$csv+=“3,Cherry,Charles`r`n”
$csv+=“4,日期,Daniel`r`n”
$csv+=“5,接骨木,Ethan`r`n”
$csv+=“6,图,账单`r`n”
$csv+=“7,葡萄,丹尼尔`r`n”
$data=从Csv转换为$Csv
$inputXML=@”
"@

$inputXML=$inputXML-replace'mc:Ignorable=“d”、'-replace“x:N”、'N'-replace'^谢谢您的回复。你测试过了吗?它为我抛出了一个关于缺少括号的错误。我尝试过改变它,但我无法让它工作。不过,你用DynamicSource绑定为我指明了正确的方向。我将owners行简化为“$owners=$data | Select Object-ExpandProperty Owner-Unique”,这似乎有效-我现在在每个组合中获得所有唯一的所有者。@Valiante:我已从回答中删除了对
ToArray()
的调用。事实上,你有双面人与最初的问题无关。我不能凭良心投票,也不能接受当它给我一个错误时的答案。我写了我自己的答案来展示你帮助我实现的完整的最终解决方案,这要归功于你,但我没有接受它作为答案,因为我想给你编辑的机会。此外,我之所以提到重复项,仅仅是因为我最初的行中没有-unique,但在现实世界中,这包括了数据中出现的每个名称的次数,而我只需要唯一的所有者(如原始帖子中所述)。@Valiante:Good point。我也在我的答案中添加了-Unique开关。