C# 在一个影响另一个对象的对象上创建一个简单的wpf触发器

C# 在一个影响另一个对象的对象上创建一个简单的wpf触发器,c#,.net,wpf,wpf-4.0,.net-4.0,C#,.net,Wpf,Wpf 4.0,.net 4.0,这是我最接近于在上面创建一个简单触发器的地方。我只希望datagrid的IsMouseOver==true显示该按钮。 问题是Setter的TargetName表示:属性“TargetName”不代表“Setter”的有效目标,因为找不到名为“ButtonExpand”的元素。确保目标在使用它的任何设置器、触发器或条件之前声明。 我做错了什么 <UserControl.Resources> <Style TargetType="DataGrid">

这是我最接近于在上面创建一个简单触发器的地方。我只希望datagrid的IsMouseOver==true显示该按钮。 问题是Setter的TargetName表示:属性“TargetName”不代表“Setter”的有效目标,因为找不到名为“ButtonExpand”的元素。确保目标在使用它的任何设置器、触发器或条件之前声明。 我做错了什么

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


+

TargetName不打算使用 在触发器集合中 一种风格。一个样式没有一个 名称范围,所以它没有意义 在此处按名称引用元素。 而是一个模板(DataTemplate或 ControlTemplate)有一个 名称镜

见链接

您可以通过另一种方式来完成,使用按钮的DataTrigger。请注意,必须在样式内设置特性可见性,DataTrigger才能工作

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

另一种方法是使用转换器将ButtonExand的Visibility绑定到DataGrid的IsMouseOver属性。


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

鼠标悬停在按钮上时会闪烁。这基本上是正确的。我不能给你的答案道具,因为我没有15级或其他级别。我在下面发布了我的答案,但我在两天内无法点击它作为答案。非常感谢你。你当然应该得到这个答案,但我不想用同样的问题把任何人搞砸。@Bluebaron:我把你的两个修改编辑成了Meleak的答案,所以现在你可以删除你的答案并把他的标记为正确。这两个更改被折叠->隐藏,maindatgrid->MainGrid,并添加周围的代码来显示MainGrid的定义位置。对,我不知道我在想什么:)编辑得好!很高兴它与更改一起工作BluebaronI将您的两个更改编辑为Meleak的答案,所以现在您可以删除此答案并将Meleak的答案标记为正确。