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

时间:2011-07-04 16:39:23

标签: c# wpf xaml styles

我有一个具有文本框和按钮的用户控件。

我想使用触发器禁用文本框(我知道如何通过代码执行此操作)

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

但是此设置会同时禁用TextBox和按钮。我怎样才能禁用按钮?如果我有几个Textbox并且我只想要其中一些被禁用,那么最佳选择是什么?如果我有几个不同的UIElements(例如textbox,calandar,datagrid和..我想用一个triger禁用所有这些,我该怎么办?

4 个答案:

答案 0 :(得分:2)

尝试将样式向下移动到网格,并将TargetName设置为textBox1。请参阅此问题的答案以获取示例:Triggers Based on Properties from DataContext

顺便说一句,您应该能够将IsEditing的值直接绑定到textBox1.IsEnabled(警告:就地编码,因此代码可能无法按原样运行)

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

答案 1 :(得分:0)

TargetName的{​​{1}}设置为按钮名称。

答案 2 :(得分:0)

最佳选择是对它们进行分组,然后一次性禁用。

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

表示密钥:

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

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

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

答案 3 :(得分:0)

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