2012-09-26 26 views
7

Mam kilka pól tekstowych i zbiór przycisków radiowych w WPF. Chcę użyć wyzwalacza, aby ustawić właściwość IsChecked dla jednego przycisku radiowego, który ma nazwę, jeśli pola tekstowe zostaną skupione. Sprawdzam kilka przykładów, ale nie mogłem znaleźć tego, czego szukałem. Pamiętaj, że używamy wzorca MVVM i nie mamy kodu.Trigger z nazwą celu

Próbowałem następujące kody i mają ten błąd kompilacji:

nieruchomość nazwa_obiektu_docelowego nie może być ustawiony na setera Style

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

czytałem inne posty i DataTrigger rozwiązać problem.

<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

Byłoby pomocne i można pokazać nam co najmniej kod XAML;) –

+0

Od MSDN 'Można ustawić tę właściwość do nazwy każdego elementu w ramach gdzie kolekcji setter (kolekcji, które ten seter jest częścią) jest stosowany. Zazwyczaj jest to nazwany element, który znajduje się w szablonie, który zawiera to ustawienie. " Nazwa celu jest najczęściej używana w szablonach kontrolnych, a nie tylko w stylach, które próbujesz z niego korzystać. –

+2

Ktoś jeszcze ma ciągle taki problem na przecięciu wyzwalaczy WPF, stylów i szablonów? Nie można użyć TargetName w seterie stylu. Kolekcja wyzwalaczy może mieć tylko EventTriggers, chyba że jest w stylu. Ups, ta kontrola działa tylko w szablonie kontrolnym, a nie w szablonie danych ... – user1454265

Odpowiedz

1

Myślę, że szukasz wydarzenia GotFocus.

w 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"/> 

Następnie w C# obsługi zdarzeń mógłby wyglądać ten

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

Jeśli którekolwiek z pól tekstowych zostanie skoncentrowane będzie sprawdzić RadioButton nazwie myRadioButton.

+2

No cóż, zapominam powiedzieć, że pozywamy MVVM i nie mamy żadnych kodów. – AustinTX

1

Od 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 jest najczęściej używane w szablonach kontroli, a nie tylko w obrębie stylów jak próbujesz go używać. Możesz związać swój kod RadioButton 'z DP z IsMouseOver DP z .

1

Tworzenie ControlTemplate i dodaj swoją spust ControlTemplate.Triggers

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

style pisać dla każdego RadioButton zapewniając odpowiednią TextBox jako wyzwalanie element. Oto przykład dla 3 przycisków TextBoxes & 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>