Wpf powershell数据模板绑定语法
我在计算powershell中itemscontrol数据绑定的语法时遇到问题。下面我有一个简单的WPF脚本,其中包含两个带有数据模板的itemscontrol示例。第一个(list01)有多个元素,不能正确显示,第二个itemscontrol(list02)只有一个绑定元素,工作正常 我正在寻找将对象绑定到第一个itemscontrol(list01)的正确语法 完成powershell脚本(:Wpf powershell数据模板绑定语法,wpf,powershell,data-binding,itemscontrol,Wpf,Powershell,Data Binding,Itemscontrol,我在计算powershell中itemscontrol数据绑定的语法时遇到问题。下面我有一个简单的WPF脚本,其中包含两个带有数据模板的itemscontrol示例。第一个(list01)有多个元素,不能正确显示,第二个itemscontrol(list02)只有一个绑定元素,工作正常 我正在寻找将对象绑定到第一个itemscontrol(list01)的正确语法 完成powershell脚本(: [xml]$xaml=@' '@ #新对象System.Windows.Controls.Item
[xml]$xaml=@'
'@
#新对象System.Windows.Controls.ItemsControl
[void][System.Reflection.Assembly]::LoadWithPartialName('PresentationFramework')
[void][reflection.assembly]::LoadWithPartialName('System.Drawing'))
#读取XAML
$Form=[Windows.Markup.XamlReader]::加载((New Object System.Xml.XmlNodeReader$xaml))
#查找对象
$MainWindow=$Form.FindName('MainWindow')
$List01=$Form.FindName('List01')
$List02=$Form.FindName('List02')
##这行不通##
$Source01=@(
[ordered]@{Title=([string]'Complete this WPF tutorial');Completion=([int]45)},
[有序]@{Title=([string]'learnc#');Completion=([int]80)},
[ordered]@{Title=([string]'Wash the car');Completion=([int]25)}
[ordered]@{Title=([string]'makekids do combiness');Completion=([int]3)}
);
##这行不通##
$Source01=@{title='test01';completion=50}
##这行不通##
$testArray=@()
$tmpObject=选择对象-输入对象“”标题,完成
$tmpObject.Title='完成此WPF教程'
$tmpObject.Completion=45
$testArray+=$tmpObject
$List01.ItemsSource=$testArray
#$List01 | gm-类型方法
##这很有效##
$Source02=@('TEST01','TEST02','TEST03')
$List02.ItemsSource=$Source02
[void]$Form.ShowDialog();
此代码基于一个非常简单的C#示例:
但是,我不确定该语法如何直接转换到powershell。我可能建议使用MVVM方法。只需设置窗口的
DataContext
属性,然后将ItemsControl.ItemsSource
属性绑定到所需列表,例如ItemsSource=“{Binding MyItemsListProperty}”
这可能是什么样子的完整示例(基于您上面发布的示例代码):
$xaml=@”
"@
[void][System.Reflection.Assembly]::LoadWithPartialName('PresentationFramework')
#读取XAML
$window=[Windows.Markup.XamlReader]::Parse($xaml)
$viewModel=新对象PSObject-属性@{
MyItemsListProperty=@(
新对象PSObject-属性@{
Title='完成此WPF教程'
完成率=45.0
};
新对象PSObject-属性@{
Title='Learn C#'
完成率=80.0
};
新对象PSObject-属性@{
Title='洗车'
完成率=25.0
};
新对象PSObject-属性@{
Title='让孩子做家庭作业'
完成率=3.0
};
)
};
$window.DataContext=$viewModel
$window.ShowDialog()
我的代码中还有其他东西需要声明吗?我遇到了这个绑定错误:使用“1”参数调用“Parse”时出现异常:“根级别的数据无效。第1行,位置1。”+$window=[Windows.Markup.XamlReader]::Parse($xaml)+FullyQualifiedErrorId:XamlParseException在该对象上找不到属性“DataContext”。请验证该属性是否存在并且是否可以设置+$window.DataContext=$viewModel+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+CategoryInfo:InvalidOperation:(:)[]+FullyQualifiedErrorId:PropertyNotFound解析
错误是唯一有趣的错误,因为另一个错误是由于无法解析而导致的。您确定复制的文本完全正确吗?我现在已尝试在四台不同的机器上使用三个不同的操作系统运行上述代码(Windows 8.1、Windows Server 2008 R2和Windows Server 2012)以及不同的PowerShell版本(v2和v4)。在所有这些尝试中,它都运行良好(只要我确保使用STA标志启动PowerShell会话,但如果没有,则不会给出您提到的错误消息).no-抱歉…字符数不足。有3个单独的错误…我将重新发布完整内容:使用“1”参数调用“Parse”时出现异常:“根级别的数据无效。第1行,位置1。”第30行char:1+$window=[Windows.Markup.XamlReader]::Parse($xaml)+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~类别信息:未指定:(:)[],MethodInvocationException+FullyQualifiedErrorId:XamlParseException在该对象上找不到属性“DataContext”。请验证该属性是否存在并且是否可以设置。在第53行,char:1+$window.DataContext=$viewModel+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~类别信息:InvalidOperation:(:)[],RuntimeException+FullyQualifiedErrorId:PropertyNotFound无法对空值表达式调用方法。在第55行,char:1+$window.ShowDialog()+~~~~~~~~~~~~~~~~~~~~~~~~~~~+CategoryInfo:InvalidOperation:(:)[],RuntimeException+FullyQualifiedErrorId:InvokeMethodUnll
[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();
$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()