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。这就是您的绑定不起作用的原因。您必须提供绑定的相对源

尝试更新绑定,例如

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

使用 {x:Type Control} 假设这是您的视图类型,否则您将不得不更改为您的视图类型。

希望这可以帮助

谢谢

于 2013-09-02T08:25:52.720 回答