在一个对象上创建一个简单的WPF触发器,影响另一个对象。

12
这是我为创建一个简单的触发器所做的最接近的尝试。我只想要当 datagrid 的 IsMouseOver == true 时显示按钮。
问题在于 Setter 的 TargetName 说:“属性'TargetName'不代表 'Setter' 的有效目标,因为未找到名为 'ButtonExpand' 的元素。请确保在使用它的任何 Setters、Triggers 或 Conditions 之前声明目标。” 我做错了什么?
<UserControl.Resources>
    <Style TargetType="DataGrid">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter TargetName="ButtonExpand" Property="Visibility" Value="Visible" />
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>
<Grid>



    <DataGrid Name="MainDataGrid" ItemsSource="{Binding Programs}" IsReadOnly="True" AutoGenerateColumns="false" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="Version" Binding="{Binding Version}"/>
            <DataGridTextColumn Header="Publisher" Binding="{Binding Publisher}"/>
        </DataGrid.Columns>
    </DataGrid>

    <Button Name="ButtonExpand" Height="25" Width="25" HorizontalAlignment="Right" VerticalAlignment="Bottom" Visibility="Hidden">+</Button>
</Grid>

2个回答

34

TargetName并不适用于Style的Triggers集合中。Style没有命名范围,因此在那里引用元素是没有意义的。但是模板(DataTemplate或ControlTemplate)具有名称范围。

参见此链接

您可以使用Button的DataTrigger以相反的方式完成。请注意,在DataTrigger中使其工作,必须在Style中设置Visibility属性。

<Grid Name="MainGrid"> 

    <DataGrid ItemsSource="{Binding Programs}"
              IsReadOnly="True"
              AutoGenerateColumns="false" > 
      <DataGrid.Columns> 
        <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
        <DataGridTextColumn Header="Version" Binding="{Binding Version}"/> 
        <DataGridTextColumn Header="Publisher" Binding="{Binding Publisher}"/> 
      </DataGrid.Columns> 
    </DataGrid> 

    <Button Name="ButtonExpand"
            Height="25"
            Width="25"
            HorizontalAlignment="Right"
            VerticalAlignment="Bottom"
            Content="+">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="Visibility" Value="Hidden"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=MainGrid,
                                                   Path=IsMouseOver}" 
                                 Value="True">
                        <Setter Property="Visibility" Value="Visible" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
</Grid>

另一种方法是将ButtonExpand的可见性绑定到DataGrid的IsMouseOver属性,并使用转换器。


当鼠标悬停在按钮上时,它会闪烁。 - Bluebaron
这基本上是正确的。我不能给你的答案点赞,因为我没有15级或其他等级。我在下面发布了我的答案,但我不能在2天内将其选为答案。非常感谢你。你绝对应该得到这个答案,但我不想用同样的问题搞砸任何人。 - Bluebaron
1
@Bluebaron:我将你的两个更改编辑到Meleak的答案中,现在你可以删除你的答案并将他的标记为正确。这两个更改是Collapsed->Hidden,MainDataGrid->MainGrid,并添加周围的代码以显示MainGrid的定义位置。 - Ray Burns
没错,我不知道当时在想什么 :) 很好的编辑 Ray!很高兴它能够适应 Bluebaron 的更改 - Fredrik Hedblad

0
<Grid Name="MainGrid">

    <DataGrid ItemsSource="{Binding Programs}" IsReadOnly="True" AutoGenerateColumns="false" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="Version" Binding="{Binding Version}"/>
            <DataGridTextColumn Header="Publisher" Binding="{Binding Publisher}"/>
        </DataGrid.Columns>
    </DataGrid>

    <Button Name="ButtonExpand" Margin="0,0,20,20" Height="25" Width="25" HorizontalAlignment="Right" VerticalAlignment="Bottom" Content="+">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="Visibility" Value="Hidden"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=MainGrid,
                                           Path=IsMouseOver}" 
                         Value="True">
                        <Setter Property="Visibility" Value="Visible" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

</Grid>

1
我将你的两个更改编辑到Meleak的答案中,现在你可以删除这个答案并将Meleak的答案标记为正确。 - Ray Burns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接