2010-11-17 23 views
6

Esto es lo más cercano que he llegado a crear un desencadenador simple sobre esto. Solo quiero que IsMouseOver == true de la cuadrícula de datos muestre el botón. El problema es que TargetName del Setter dice: La propiedad 'TargetName' no representa un objetivo válido para 'Setter' porque no se encontró un elemento llamado 'ButtonExpand'. Asegúrese de que el objetivo se declara antes de cualquier Setter, Trigger o condición que lo use. ¿Qué estoy haciendo mal?Crear un disparador wpf simple en un objeto que afecta a otro

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

Respuesta

21

TargetName no está diseñada para uso dentro de la colección de disparadores un estilo. Un estilo no tiene un namescope , por lo que no tiene sentido para hacer referencia a los elementos por su nombre. Pero una plantilla (ya sea DataTemplate o ControlTemplate) tiene un namescope .

Ver this enlace.

Puede hacerlo al revés con un DataTrigger para el botón. Tenga en cuenta que debe establecer la Visibilidad de la propiedad dentro del Estilo para que DataTrigger funcione.

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

Otra manera de hacerlo sería para unirse visibilidad de ButtonExpand a la propiedad IsMouseOver de la cuadrícula de datos con un convertidor.

+0

Cuando el mouse está sobre el botón, parpadea. – Bluebaron

+0

Esto es principalmente correcto. No puedo darles los puntales de respuesta porque no tengo el nivel 15 o algo así. Publiqué mi respuesta a continuación, pero no puedo hacer clic en ella como la respuesta durante 2 días. Muchas gracias. Definitivamente mereces la respuesta para esto, pero no quiero fastidiar a nadie con la misma pregunta. – Bluebaron

+1

@Bluebaron: edité tus dos cambios en la respuesta de Meleak, por lo que ahora puedes eliminar tu respuesta y marcarla como correcta. Los dos cambios se colapsaron -> Oculto, MainDataGrid -> MainGrid, y para agregar el código circundante para mostrar dónde se define MainGrid. –

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

Edité tus dos cambios en la respuesta de Meleak, por lo que ahora puedes eliminar esta respuesta y marcar la respuesta de Meleak como correcta. –

Cuestiones relacionadas