1

OK、次の DataTemplate を取得しました。

 Style="{StaticResource LBStyle}" HorizontalContentAlignment="Stretch">
                <ListBox.ItemTemplate>

                    <DataTemplate>
                        <Grid >
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="1*"/> 
                                <ColumnDefinition Width="100" />
                            </Grid.ColumnDefinitions>
                            <Label Content="{Binding Name}" x:Name="txt" Grid.Column="0"></Label>
                            <StackPanel Orientation="Vertical" Grid.Column="1">
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="{z:txt text=time}" Width="50">:</TextBlock>
                                    <TextBlock Text="{Binding Path=Value, Converter={StaticResource DecFix}}" />
                                </StackPanel>

                                <StackPanel Orientation="Horizontal" Width="50">
                                    <TextBlock Text="Norm.">:</TextBlock>
                                    <TextBlock Text="{Binding Path=NormaalWaarde, Converter={StaticResource DecFix}}" />
                                </StackPanel>
                            </StackPanel>
                        </Grid>

                        <DataTemplate.Triggers>
                            <DataTrigger Binding="{Binding IsCurrentStep}" Value="True">
                                <Setter TargetName="txt" Property="FontWeight" Value="Bold"/>
                            </DataTrigger> 
                        </DataTemplate.Triggers>
                    </DataTemplate>
                </ListBox.ItemTemplate>

基本的に私が欲しいのは、各項目の左側にテキストがあり、リストボックスの幅に合わせて伸び、右側に2つの値があり、右側にとどまることです。私はこれを多くの異なる種類のパネル、グリッドなどで試しました。そして、それらはすべて、次のように左側のテキストに一緒にラップされた右側の値を配置しているようです:

リンク テキスト (リンクを使用して意味を確認してください。まだ写真を投稿できません)

同じデータテンプレートをスタンドアロンで別の場所に配置すると、それがすべきことを実行するだけです。誰か提案がありますか?

編集:リストボックスとウィンドウの残りの部分の間にグリッドスプリッターを配置すると、リストボックスが無限に伸びているように見えます。これは、リストボックスがウィンドウ内の他の要素の中にどのように配置されているかです: (リストボックスはタガーのユーザーコントロールにあります)

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="2.5*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>           
        <RowDefinition/>
    </Grid.RowDefinitions>

    <vid:TagControl x:Name="Tagger" Grid.Column="0"></vid:TagControl>

    <GridSplitter ResizeDirection="Columns" Width="20" />

    <vid:DShowPlayer x:Name="DShowPlayer1" Grid.Column="1"></vid:DShowPlayer>
</Grid>
4

3 に答える 3

1

ここでの問題は、DataTemplate とはまったく関係がなく、データ バインディングを使用しているかどうかとはまったく関係ありません。ListBox または ListBoxItem スタイルまたは ControlTemplate の何かが原因で、コントロールの Horizo​​ntalAlignment が特定のレベルで "Stretch" に設定されていません。(または、あるレベルで Horizo​​ntalAlignment を無視するカスタム Measure または Arrange コードを使用している可能性があります)

あなたStyle="{StaticResource LBStyle}が犯人であるか、表示されていない他の ListBox プロパティであると思われます。

  • デフォルトの ListBox スタイルには、Border と ScrollViewer を含むテンプレートが含まれていますが、いずれにも Horizo​​ntalAlignment 設定は含まれていません
  • デフォルトの ListBox ItemsPanel テンプレートは StackPanel で構成されており、これには Horizo​​ntalAlignment 設定も含まれていません
  • デフォルトの ListBoxItem テンプレートには、Border と ContentPresenter を含むテンプレートが含まれています。Border のみに Horizo​​ntalAlignment 設定が含まれており、(スタイル セッターを介して) "Stretch" に設定した含まれている ListBox の Horizo​​ntalContentAlignment に設定されます。

単独で実行すると、投稿したコードは正常に動作します。スタイル (およびその他のプロパティ、コード ビハインド設定など) を検索して、デフォルトの Horizo​​ntalAlignment 処理をオーバーライドするテンプレートの置換または設定を探します。

最初に問題が明らかでない場合は、動作しなくなるまで設定を 1 つずつ削除してから、削除したものを詳しく調べます。

于 2009-11-12T18:40:04.227 に答える
0

DockPanel の代わりに Grid を 3 列、1 列目を 1 * 、2 列目と 3 列目を固定長として使用する必要があります...

于 2009-11-11T19:26:05.247 に答える
0

私が見つけることができるDataTemplateの例はどれもこれを明示的に述べていません、リスト項目がItemsSourceバインディングからのものである場合にのみDataTemplatesが適用されるようです。Items コレクションを直接設定する場合、DataTemplate は使用されません。

Expression Blend で ItemTemplate を追加すると、コマンド テキストに「Generated Item Template」と表示されます。これは、アイテムが間接的に生成される場合にのみテンプレートが使用されることを意味するようです。

そして、私が見つけることができるすべての例は、アイテム ソースのデータ バインディングを使用しています。

于 2009-11-11T18:47:16.870 に答える