powershell datatemplate绑定语法

时间:2014-03-10 06:58:28

标签: wpf powershell data-binding itemscontrol

我在弄清楚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。

1 个答案:

答案 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()