【问题标题】:changing binding based on datatrigger property根据 datatrigger 属性更改绑定
【发布时间】:2013-09-05 06:44:27
【问题描述】:

我正在尝试根据数据触发器更改文本块的文本。数据触发器如下所示:

    <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>

【问题讨论】:

标签: c# wpf xaml properties datatrigger


【解决方案1】:

由于文本块显示在列表视图中,因此如果未明确设置,文本块的 DataContext 将是 ItemDataContext。这就是您的绑定不起作用的原因。您必须提供绑定的相对源

尝试更新绑定,例如

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

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

希望对你有帮助

谢谢

【讨论】:

  • 我的类型是 UserControl。所以我将其更改为: 不幸的是,它不起作用。文本仍然是空白的。
  • 您是否在输出窗口中收到有关此绑定的任何异常?
  • 不,没有例外。文本只是保持空白。
  • 这很奇怪,Visual Studio 的输出窗口没有显示任何异常并且仍然​​绑定失败。您能否分享设置此样式和列表框的完整代码
  • 见鬼,注意它应该是 Binding Path=ShowFileExtensions 而不是 Binding Path=ShowFileExtensionsProperty :( 请参阅更新后的答案。其余的相对来源应该是相同的
猜你喜欢
  • 2012-01-31
  • 2013-06-25
  • 2013-06-18
  • 1970-01-01
  • 2017-11-06
相关资源
最近更新 更多