12

我在 WPF 中有几个文本框和单选按钮集合。我想使用触发器设置只有一个单选按钮的 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>
4

4 回答 4

2

创建一个 ControlTemplate 并将您的触发器添加到 ControlTemplate.Triggers

<ControlTemplate.Triggers>
    <Trigger Property="HasText" Value="True">
        <Setter Property="Visibility" TargetName="LabelText" Value="Hidden" />
     </Trigger>
</ControlTemplate.Triggers>
于 2017-06-09T20:32:30.680 回答
2

为每个提供相应 TextBox 作为触发元素的 RadioButton 编写样式。以下是 3 个文本框和 3 个单选按钮的示例。

<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>
于 2017-09-20T05:49:10.440 回答
1

来自 MSDN:

您可以将此属性设置为应用 setter 集合(此 setter 所属的集合)范围内的任何元素的名称。这通常是包含此设置器的模板中的命名元素。

TargetName主要在控件模板中使用,而不仅仅是在您尝试使用它的样式中。您可以做的是将您RadioButtonIsCheckedDP绑定IsMouseOverTextBox.

于 2012-09-26T19:30:20.290 回答
0

我认为您正在寻找 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 的 RadioButton。

于 2012-09-26T17:50:17.107 回答