如何在触发器中设置属性(WPF)

3

我有一个用户控件,里面有一个文本框和一个按钮。

我想使用触发器禁用文本框(我知道如何通过代码实现)。

XAML如下:

<UserControl x:Class="MyProject.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:l="clr-namespace:MyProject"
         mc:Ignorable="d"
         d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Resources>
        <Style TargetType="l:UserControl1" >
            <Style.Triggers>
    <Trigger Property="l:UserControl1.IsEditing" Value="True">
        <Setter  Property="IsEnabled" Value="False"></Setter>
        </Trigger>
     </Style.Triggers>
</Style>
   </UserControl.Resources>
   <Grid>
<Grid.RowDefinitions>
    <RowDefinition />
    <RowDefinition />
</Grid.RowDefinitions>
    <Button Content="Button" HorizontalAlignment="Left" x:Name="button1" VerticalAlignment="Top" Width="75" Grid.Row="0" Click="button1_Click" />
    <TextBox Height="23" HorizontalAlignment="Left" x:Name="textBox1" VerticalAlignment="Top" Width="120" Grid.Row="1"/>
</Grid>
</UserControl>

代码如下:
using System;
using System.Windows;
using System.Windows.Controls;

    namespace MyProject
    {
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class UserControl1 : UserControl
   {
        public static readonly DependencyProperty IsEditingProperty = DependencyProperty.Register(
                "IsEditing", typeof(Boolean), typeof(UserControl), new PropertyMetadata(false));

        public Boolean IsEditing
        {
            get { return (Boolean)GetValue(IsEditingProperty); }
            set { SetValue(IsEditingProperty, value); }
        }

        public UserControl1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            IsEditing = !IsEditing;
        }
       }
}

但是这个设置会禁用文本框和按钮。我怎样才能只禁用按钮呢?如果我有几个文本框,我只想禁用其中的一些,最好的选择是什么?如果我有几个不同的UI元素(例如文本框、日历、数据网格等),我想使用一个触发器禁用它们所有,我应该怎么做?

4个回答

2

尝试将样式移至网格中,并将TargetName设置为textBox1。参考此问题的答案,例如:Triggers Based on Properties from DataContext

顺便提一句,您应该能够直接将IsEditing的值绑定到textBox1.IsEnabled(警告:原地编码,因此代码可能无法正常工作)。

<Button IsEnabled="{Binding Path=IsEditing RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl1}}} />

我正在使用绑定技术。我找不到任何使用触发器的方法。 - mans

0

最好的选择是将它们分组,然后一次性禁用。

在您的代码中,您没有为样式指定x:Key。如果您不指定键,则尝试将其用作所有类型为UserControl1的控件的默认样式。然后,您可以将该样式附加到UserControl1中的子控件:

关于键:

<Style x:Key="styleDefault" TargetType="Control">

将样式附加到您的子控件:

 <Button Style="{StaticResource styleDefault}"></Button>

我在样式中添加了x:key:<Style TargetType="l:UserControl1" x:Key="DisableControl">,然后将其与TextBox一起使用,如下所示:<TextBox Height="23" HorizontalAlignment="Left" x:Name="textBox1" VerticalAlignment="Top" Width="120" Grid.Row="1" Style="{StaticResource DisableControl}"/> 但是我遇到了这个错误:“UserControl1”的TargetType与元素“TextBox”的类型不匹配。 - mans
更新了代码,使其通用化,可以用于所有控件。 - Bek Raupov
我做了这个,但触发器不起作用了。没有控件变得无效。 - mans

0

SetterTargetName设置为按钮的名称。


我做了这个:<Setter TargetName="textBox1" Property="IsEnabled" Value="False"></Setter> 但是我收到一个错误,说:“属性'TargetName'不代表'Setter'的有效目标,因为没有找到名为'textBox1'的元素。确保在使用它的任何Setter、Trigger或Condition之前声明目标。” - mans

0
我认为这里的问题在于您正在使用EventTrigger,它是唯一可以直接设置在样式上而不使用模板的触发器。据我所知,如果您使用此类触发器,则只能设置触发事件的对象的属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接