2

データトリガーに基づいてテキストブロックのテキストを変更しようとしています。データトリガーは次のようになります。

    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=ShowFileExtensionsProperty}" Value="true">
            <Setter Property="Text" Value="{Binding Path=Name}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=ShowFileExtensionsProperty}" Value="false">
            <Setter Property="Text" Value="{Binding Path=NameWithoutExtension}" />
        </DataTrigger>
    </Style.Triggers>
</Style>

このコードは、クラス「MyView」の xaml ファイル内にあります。このクラスの cs ファイルには、次のコードが含まれています。

public static readonly DependencyProperty ShowFileExtensionsProperty =
DependencyProperty.Register("ShowFileExtensions", typeof(bool), typeof(MyView), new UIPropertyMetadata(false));

public bool ShowFileExtensions
{
    get { return (bool)GetValue(ShowFileExtensionsProperty); }
    set
    {
        SetValue(ShowFileExtensionsProperty, value);
        updateViewCollection();
    }
}

テキストブロックは、オブジェクトのリストにバインドされたリストビュー内に表示されます。これらのオブジェクトには、プロパティ「Name」および「NameWithoutExtension」が含まれます。

問題は、テキストブロック内のテキストが常に空白のままになることです。どういうわけか、データトリガーは決してトリガーされません。データトリガーの何が問題なのか考えていますか?

PS: 完全なコードは次のとおりです

<UserControl x:Class="com.xploreplus.Filedrops.explorer.listview.FiledropsFileList"
         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:l="clr-namespace:com.xploreplus.Filedrops.explorer.listview.views"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
    <Style x:Key="Extension" TargetType="{x:Type TextBlock}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=ShowFileExtensionsProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" Value="true">
                <Setter Property="Text" Value="brol2" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=ShowFileExtensionsProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" Value="false">
                <Setter Property="Text" Value="blabla" />
            </DataTrigger>
        </Style.Triggers>
    </Style>

</UserControl.Resources>

<Grid>
    <ListView Name="viewComponent">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Image Width="16" Height="16" Source="{Binding Path=Icon}" />
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Name">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Style="{StaticResource Extension}" />
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Extension" DisplayMemberBinding="{Binding Path=Extension}" />
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

4

1 に答える 1

0

テキストブロックはリストビューに表示されるため、明示的に設定されていない場合、テキストブロックの DataContext は ItemDataContext になります。そのため、バインディングが機能していません。バインディングにrelativesourceを提供する必要があります

次のようにバインディングを更新してみてください

<DataTrigger Binding="{Binding Path=ShowFileExtensions, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" Value="true">

これがビューのタイプであると仮定して {x:Type Control} を使用しました。それ以外の場合は、ビュー タイプに変更する必要があります。

お役に立てれば

ありがとう

于 2013-09-02T08:25:52.720 に答える