3

SomePropertyの値が10の場合、コードビハインドなしでリストボックスの最初の項目のマージンを変更したいと思います。これは私がこれまでに持っているものです:

<ListBox  x:Class="Windows.CustomList"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:Windows"
                 mc:Ignorable="d" x:Name="MyList"
                 d:DesignHeight="300" d:DesignWidth="300">
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding Path=SomeProperty}" Value="10"/>
                        <Condition Binding="{Binding Path=Items.Count, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}}" Value="1" />
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Margin">
                        <Setter.Value>
                            <Thickness Left="500"/>
                        </Setter.Value>
                    </Setter>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <local:ListBoxItemCustomTemplate/>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

このアプローチを試してみると、次のようになります。

System.Windows.Dataエラー:4:参照'RelativeSource FindAncestor、AncestorType ='ListBox'、AncestorLevel='1''でバインドするためのソースが見つかりません。BindingExpression:Path = Items.Count; DataItem = null; ターゲット要素は'ListBox'(Name ='');です。ターゲットプロパティは「NoTarget」(タイプ「Object」)です

最初の条件しかない場合は、マージンが適切に適用されます。私が試したもう1つの方法は、ElementNameを使用することでした。

このアプローチではエラーは発生しませんが、機能しません。

どんな助けでも大歓迎です。

4

2 に答える 2

5

を参照してくださいAlternationIndex。(非常に高い値を使用AlternationCountして、最初のアイテムのみにインデックス0とトリガーがあることを確認できます)。

これは少し乱用です。よりクリーンな方法は、値コンバーター/マルチ値コンバーターであり、のようなものを介してインデックスを取得しますlistBox.Items.IndexOf(currentItem)

于 2012-07-12T23:58:36.210 に答える
0

別の解決策は、リストボックスをサブクラス化し、PrepareContainerForItemOverrideメソッドをオーバーライドすることです。以下の私の例を参照してください(WP7のSilverlight用であるため、AlternationIndexはありませんでした)。

public class ListBoxEx: ListBox
{
    public interface iContainerStyle
    {
        Thickness containerMargin { get; }
        Thickness containerPadding { get; }
    };

    protected override void PrepareContainerForItemOverride( DependencyObject element, Object item )
    {
        base.PrepareContainerForItemOverride( element, item );

        var style = item as iContainerStyle;
        if( null == style )
            return;

        var container = element as ListBoxItem;
        if( null == container )
            return;
        container.Margin = style.containerMargin;
        container.Padding = style.containerPadding;
    }
}

次に、ListBoxEx.iContainerStyleからアイテムを派生させて、アイテムごとに異なるマージンを取得します。

于 2012-10-10T00:52:58.047 に答える