Erstellen Sie eine einfache WPF-Trigger auf ein Objekt, das ein anderes beeinflusst
Frage
Dies ist der nächste, dass ich einen einfachen Auslöser zur Schaffung dazu gekommen sind. Ich will nur das Datagrid der IsMouseOver == true den Knopf zeigen. Das Problem ist, dass die Setter des Target sagt: Die Eigenschaft ‚Targetname‘ kein gültiges Ziel für die ‚Setter‘ darstellen, da ein Element namens ‚ButtonExpand‘ wurde nicht gefunden. Stellen Sie sicher, dass das Ziel, bevor irgendwelche Setters, Trigger deklariert wird oder Bedingungen, die sie verwenden. Was mache ich falsch?
<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>
Lösung
Targetname ist nicht dafür bestimmt, innerhalb des Triggers Sammlung von ein Stil. Ein Stil hat keine Namescope, so macht es keinen Sinn machen beziehen sich auf Elemente mit Namen. Aber eine Vorlage (entweder Datatemplate oder Control) hat eine haben Namescope.
Siehe dieser Link.
Sie können es umgekehrt mit einem Datatrigger für die Schaltfläche. Beachten Sie, dass Sie die Eigenschaft Sichtbarkeit im Stil für die Datatrigger zur Arbeit einstellen müssen.
<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>
Eine andere Möglichkeit, es zu tun zu binden Sichtbarkeit ButtonExpand wäre die IsMouseOver Eigenschaft des Datagrid mit einem Konverter.
Andere Tipps
<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>