我在弄清楚powershell中的itemscontrol数据绑定的语法时遇到了问题。我在下面有一个简单的WPF脚本,带有2个带有数据模板的itemscontrol示例。第一个(list01)有多个元素并且没有正确显示,第二个itemscontrol(list02)只有一个绑定元素并且工作得很好。
我正在寻找将对象绑定到第一个itemscontrol(list01)的正确语法。
完整的PowerShell脚本(:
[xml]$xaml = @'
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="MainWindow"
Title="ItemsControlDataBindingSample" Height="350" Width="300">
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition MinHeight="20"/>
<RowDefinition MinHeight="50"/>
<RowDefinition MinHeight="50"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
</Grid.ColumnDefinitions>
<ItemsControl Name="LIST01" Grid.Row="1">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Title}" />
<ProgressBar Grid.Column="1" Minimum="0" Maximum="100" Value="{Binding Completion}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl Name="LIST02" Grid.Row="2">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Content="{Binding}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</Window>
'@
#New-Object System.Windows.Controls.ItemsControl
[void][System.Reflection.Assembly]::LoadWithPartialName('PresentationFramework')
[void][reflection.assembly]::LoadWithPartialName('System.Drawing')
#Read XAML
$Form = [Windows.Markup.XamlReader]::Load( (New-Object System.Xml.XmlNodeReader $xaml) )
#Find objects
$MainWindow = $Form.FindName('MainWindow')
$List01 = $Form.FindName('LIST01')
$List02 = $Form.FindName('LIST02')
## this does not work ##
$Source01 = @(
[ordered]@{ Title=([string]'Complete this WPF tutorial'); Completion=([int]45) },
[ordered]@{ Title=([string]'Learn C#'); Completion=([int]80) },
[ordered]@{ Title=([string]'Wash the car'); Completion=([int]25) }
[ordered]@{ Title=([string]'Make KIDS do homework'); Completion=([int]3) }
);
## this does not work ##
$Source01 = @{ title='test01'; completion=50 }
## this does not work ##
$testArray = @()
$tmpObject = Select-Object -InputObject "" Title,Completion
$tmpObject.Title = 'Complete this WPF tutorial'
$tmpObject.Completion = 45
$testArray += $tmpObject
$List01.ItemsSource = $testArray
#$List01 | gm -type method
## this WORKS ##
$Source02 = @('TEST01','TEST02','TEST03')
$List02.ItemsSource = $Source02
[void]$Form.ShowDialog();
此代码基于一个非常简单的C#示例:http://www.wpf-tutorial.com/list-controls/itemscontrol
但是,我不确定该语法如何直接转换为powershell。
答案 0 :(得分:4)
我可能会建议使用MVVM方法。只需设置窗口的DataContext
属性,然后将ItemsControl.ItemsSource
属性绑定到所需的列表,例如ItemsSource="{Binding MyItemsListProperty}"
。
这可能是什么样子的完整示例(基于您在上面发布的示例代码):
$xaml = @"
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="MainWindow"
Title="ItemsControlDataBindingSample" Height="350" Width="300">
<Grid Margin="10">
<ItemsControl ItemsSource="{Binding MyItemsListProperty}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Title}" />
<ProgressBar Grid.Column="1" Minimum="0" Maximum="100" Value="{Binding Completion}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</Window>
"@
[void][System.Reflection.Assembly]::LoadWithPartialName('PresentationFramework')
#Read XAML
$window = [Windows.Markup.XamlReader]::Parse($xaml)
$viewModel = New-Object PSObject -Property @{
MyItemsListProperty = @(
New-Object PSObject -Property @{
Title='Complete this WPF tutorial'
Completion=45.0
};
New-Object PSObject -Property @{
Title='Learn C#'
Completion=80.0
};
New-Object PSObject -Property @{
Title='Wash the car'
Completion=25.0
};
New-Object PSObject -Property @{
Title='Make KIDS do homework'
Completion=3.0
};
)
};
$window.DataContext = $viewModel
$window.ShowDialog()