我有一个具有文本框和按钮的用户控件。
我想使用触发器禁用文本框(我知道如何通过代码执行此操作)
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禁用所有这些,我该怎么办?
答案 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如果使用这种触发器,则只能设置触发事件的对象的属性。