2012-09-26 91 views
7

我有幾個文本框和WPF單選按鈕的集合。我想要使​​用觸發器設置oly單選按鈕的IsChecked屬性,如果任何文本框獲得焦點,該按鈕將具有一個名稱。我檢查了幾個例子,但是我找不到我想要的。請記住,我們使用的是MVVM模式,並且沒有代碼。觸發與目標名稱

我嘗試了以下代碼,並有這樣的編譯錯誤:

targetName屬性不能在風格二傳手

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

我讀其他職位和DataTrigger解決問題來設定。

<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

這將是有益的我,你能告訴我們至少XAML代碼;) –

+0

從MSDN '你可以在二傳手採集(採集的範圍內設置該屬性的任何元素的名稱這個setter是一部分)被應用。這通常是包含此設置程序的模板中的一個命名元素。「# TargetName主要用於控件模板中,而不僅僅是在您嘗試使用它的樣式中。 –

+2

其他人只是在WPF觸發器,樣式和模板的交集處不斷出現這種問題?無法在樣式設置器中使用TargetName。觸發器集合只能包含EventTriggers,除非它在Style中。哎呀,該控件只能在控件模板中使用,而不能在數據模板中使用... – user1454265

回答

1

我認爲您正在尋找GotFocus活動。

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

然後在你的C#事件處理程序可能看起來像這樣

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

如果任何一個文本框被集中它將檢查單選按鈕命名myRadioButton。

+2

好吧,我忘記告訴你我們正在起訴MVVM,並且沒有任何代碼。 – AustinTX

1

從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主要是內控制模板中使用,而不是內部的風格單純的喜歡你正在嘗試使用它。您可以做的是將RadioButtonIsChecked DP綁定到TextBoxIsMouseOver DP。

1

創建控件模板和你的觸發器添加到ControlTemplate.Triggers

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

寫樣式每個單選按鈕提供各自的文本框爲觸發元件。以下是3個文本框的示例& 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>