2012-09-26 25 views
7

Tengo un par de cuadros de texto y una colección de botones de opción en WPF. Quiero utilizar el disparador para configurar la propiedad IsChecked de un solo botón de radio que tiene un nombre si los cuadros de texto se enfocan. Reviso algunos ejemplos pero no pude encontrar lo que estaba buscando. Recuerde, estamos usando el patrón MVVM y no hay código detrás.Disparador con el nombre de destino

Probé los siguientes códigos y tienen este error de compilación:

propiedad TargetName no se puede ajustar en un organismo Estilo

<UserControl.Resources> 
      <Style x:Name="myTest" TargetType="TextBox"> 
       <Style.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="RadioButton.IsChecked" Value="True" TargetName="myRadioButton"></Setter> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </UserControl.Resources> 

He leído otros puestos y DataTrigger solucionar el problema.

<Style x:Name="myTest2" TargetType="RadioButton" > 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding IsFocused, ElementName=myTextBox}" Value="True"> 
      <Setter Property="IsChecked" Value="True" ></Setter> 
     </DataTrigger>  
    </Style.Triggers> 
</Style> 
+1

Sería útil que nos pudiera mostrar al menos el código XAML;) –

+0

De MSDN 'Puede establecer esta propiedad en el nombre de cualquier elemento dentro del alcance de donde la colección colocador (la colección que este setter es parte de) se aplica. Normalmente, este es un elemento con nombre que se encuentra dentro de la plantilla que contiene este setter. TargetName se usa principalmente en plantillas de control y no simplemente en estilos como el que está intentando usar. –

+2

¿Alguien más tiene constantemente este tipo de problema en la intersección de los desencadenadores, estilos y plantillas de WPF? No se puede usar TargetName en un clasificador de estilos. La colección Triggers solo puede tener EventTriggers, a menos que esté en un estilo. Vaya, ese control solo funciona en una plantilla de control, no en una plantilla de datos ... – user1454265

Respuesta

1

Creo que estás buscando el evento GotFocus.

En XAML:

<TextBox x:Name="textBox1" GotFocus="tb_GotFocus"/> 
<TextBox x:Name="textBox2" GotFocus="tb_GotFocus"/> 
<TextBox x:Name="textBox3" GotFocus="tb_GotFocus"/> 
<RadioButton x:Name="myRadioButton"/> 

Luego, en su C# el controlador de eventos podría ser algo como esto

private void tb_GotFocus(object sender, RoutedEventArgs e) 
{ 
    myRadioButton.IsChecked = true; 
} 

Si cualquiera de los cuadros de texto quedan enfocadas que se compruebe la RadioButton llamado myRadioButton.

+2

Bueno, olvidé decirte que estamos demandando a MVVM y no hay códigos detrás. – AustinTX

1

De MSDN:

You can set this property to the name of any element within the scope of where the setter collection (the collection that this setter is part of) is applied. This is typically a named element that is within the template that contains this setter.

TargetName se utiliza sobre todo dentro de las plantillas de control y no simplemente dentro de los estilos como el que está tratando de usarlo. Lo que puede hacer es vincular el RadioButton de su IsChecked DP al IsMouseOver DP del TextBox.

1

Crear una ControlTemplate y una su gatillo para ControlTemplate.Triggers

<ControlTemplate.Triggers> 
    <Trigger Property="HasText" Value="True"> 
     <Setter Property="Visibility" TargetName="LabelText" Value="Hidden" /> 
    </Trigger> 
</ControlTemplate.Triggers> 
0

estilos de escritura para cada RadioButton proporcionar respectivo cuadro de texto como elemento desencadenante. Lo que sigue es un ejemplo para 3 cuadros de texto & 3 RadioButtons.

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <TextBox x:Name="txtBox0" Grid.Row="0"/> 
    <TextBox x:Name="txtBox1" Grid.Row="1"/> 
    <TextBox x:Name="txtBox2" Grid.Row="2"/> 

    <StackPanel Grid.Row="3" Orientation="Horizontal"> 
     <RadioButton GroupName="grp1" Content="txt1"> 
      <RadioButton.Style> 
       <Style TargetType="RadioButton"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding IsFocused, ElementName=txtBox0}" Value="True"> 
          <Setter Property="IsChecked" Value="True"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </RadioButton.Style> 
     </RadioButton> 
     <RadioButton GroupName="grp1" Content="txt2"> 
      <RadioButton.Style> 
       <Style TargetType="RadioButton"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding IsFocused, ElementName=txtBox1}" Value="True"> 
          <Setter Property="IsChecked" Value="True"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </RadioButton.Style> 
     </RadioButton> 
     <RadioButton GroupName="grp1" Content="txt3"> 
      <RadioButton.Style> 
       <Style TargetType="RadioButton"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding IsFocused, ElementName=txtBox2}" Value="True"> 
          <Setter Property="IsChecked" Value="True"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </RadioButton.Style> 
     </RadioButton> 
    </StackPanel> 
</Grid> 
Cuestiones relacionadas