Как установить свойство в триггере (WPF) - PullRequest
3 голосов
/ 04 июля 2011

У меня есть пользовательский элемент управления, который имеет текстовое поле и кнопку.

Я хочу отключить текстовое поле с помощью триггера (я знаю, как сделать это с помощью кода)

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, и кнопку.Как я могу только отключить кнопку?Если у меня есть несколько текстовых полей, и я хочу, чтобы только некоторые из них были отключены, что является лучшим вариантом?Что мне делать, если у меня есть несколько разных элементов UIE (таких как textbox, calandar, datagrid и ... и я хочу отключить их все с помощью одного триггера?

Ответы [ 4 ]

2 голосов
/ 04 июля 2011

Попробуйте переместить стиль вниз к вашей сетке и установите для TargetName значение textBox1.См. Ответ на этот вопрос для примера: Триггеры, основанные на свойствах из DataContext

Кстати, вы должны иметь возможность привязать значение IsEditing непосредственно к textBox1.IsEnabled (предупреждение: кодирование в, поэтому код может не работать как есть)

<Button IsEnabled="{Binding Path=IsEditing RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl1}}} />
0 голосов
/ 04 июля 2011

Я думаю, что проблема в том, что вы используете EventTrigger, это единственный триггер, который может быть установлен непосредственно на стиль, не используя шаблон.AFAIK, если вы используете этот вид триггера, вы можете установить только свойства объекта, который вызвал событие.

0 голосов
/ 04 июля 2011

лучший вариант - сгруппировать их, а затем отключить за один раз.

в вашем коде вы не указали x: Key для своего стиля. Если вы не укажете этот ключ, он попытается использовать его в качестве стиля по умолчанию для всех элементов управления типа UserControl1. и затем вы можете прикрепить этот стиль к дочерним элементам управления в вашем UserControl1:

для ключа:

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

прикрепить стиль к вашему дочернему элементу управления:

 <Button Style="{StaticResource styleDefault}"></Button>
0 голосов
/ 04 июля 2011

Установите TargetName для Setter на имя кнопки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...