2012-09-26 30 views
7

Tôi có một vài hộp văn bản và tập hợp các nút radio trong WPF. Tôi muốn sử dụng kích hoạt để thiết lập thuộc tính IsChecked của một nút radio có một tên nếu có bất kỳ hộp văn bản nào được lấy nét. Tôi kiểm tra một vài ví dụ nhưng tôi không thể tìm thấy những gì tôi đang tìm kiếm. Hãy nhớ rằng, chúng tôi đang sử dụng mẫu MVVM và không có mã phía sau.Trình kích hoạt có tên mục tiêu

Tôi đã thử các mã sau và có lỗi biên dịch này:

tài sản TargetName không thể được đặt trên một Setter Phong cách

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

Tôi đọc các bài viết khác và DataTrigger khắc phục vấn đề.

<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

Nó sẽ giúp ích tôi bạn có thể chỉ cho chúng ta ít nhất mã XAML;) –

+0

Từ MSDN 'Bạn có thể đặt khách sạn này đến tên của bất kỳ yếu tố trong phạm vi nơi thu setter (bộ sưu tập mà setter này là một phần của) được áp dụng. Đây thường là một phần tử được đặt tên nằm trong khuôn mẫu chứa setter này.' TargetName chủ yếu được sử dụng trong các mẫu điều khiển và không chỉ đơn giản là trong các kiểu như bạn đang cố gắng sử dụng nó. –

+2

Bất kỳ ai khác chỉ liên tục gặp phải vấn đề này tại giao điểm của trình kích hoạt, kiểu và mẫu của WPF? Không thể sử dụng TargetName trong trình thiết lập Kiểu. Bộ sưu tập kích hoạt chỉ có thể có EventTriggers, trừ khi nó trong một Style. Rất tiếc, kiểm soát đó chỉ hoạt động trong mẫu kiểm soát, không phải mẫu dữ liệu ... – user1454265

Trả lời

1

Tôi nghĩ bạn đang tìm kiếm sự kiện GotFocus.

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

Sau đó, trong C# xử lý sự kiện của bạn có thể giống như thế này

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

Nếu bất kỳ textbox được tập trung nó sẽ kiểm tra RadioButton tên myRadioButton.

+2

Vâng, tôi quên nói với bạn rằng chúng tôi đang kiện MVVM và không có mã nào phía sau. – AustinTX

1

Từ 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 chủ yếu được sử dụng trong các mẫu kiểm soát và không chỉ đơn giản trong phong cách như bạn đang cố gắng sử dụng nó. Những gì bạn có thể làm là liên kết số IsChecked DP của DP với số IsMouseOver DP của số TextBox.

1

Tạo một ControlTemplate và thêm kích hoạt của bạn để ControlTemplate.Triggers

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

Write phong cách cho mỗi RadioButton cung cấp TextBox tương ứng như kích hoạt phần tử. Sau đây là ví dụ cho 3 Hộp văn bản & 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> 
Các vấn đề liên quan