WPF триггер / привязки не работают - PullRequest
2 голосов
/ 29 июня 2011

Я пытаюсь настроить подкласс TextBox, который изменит свой стиль на основе нескольких разных вещей, и я столкнулся с двумя проблемами. Первый триггер, VisualBrush, запускается правильно, но не записывает текст в строку myName. Я попытался сделать myName свойством, но по какой-то причине метод set вызывает исключение StackOverFlowException.

Вторая проблема связана с DataTrigger, который не запускается, даже если для isRequired задано значение false.

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

Вот мой XAML:

    <TextBox.Style>
    <Style TargetType="TextBox">
        <Style.Triggers>
            <Trigger Property="Text" Value="">
                <Setter Property="Background">
                    <Setter.Value>
                        <VisualBrush Stretch="None">
                            <VisualBrush.Visual>
                                <TextBlock Foreground="Gray" FontSize="24">
                                        <TextBlock.Text>
                                            <Binding Path="myName" RelativeSource="{RelativeSource Self}" />
                                        </TextBlock.Text>
                                </TextBlock>
                            </VisualBrush.Visual>
                        </VisualBrush>
                    </Setter.Value>
                </Setter>
            </Trigger>
            <DataTrigger Binding="{Binding Path=isRequired, Source={RelativeSource Self}}" Value="False">
                <Setter Property="Text" Value="100" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</TextBox.Style>

CS:

    public partial class SuperTB : TextBox
{
    public String myName
    {
        get { return myName; }
        set {}
    }

    DependencyProperty isRequiredProperty = DependencyProperty.Register("isRequired", typeof(Boolean), typeof(SuperTB));

    public Boolean isRequired
    {
        get { return (Boolean)GetValue(isRequiredProperty); }
        set { SetValue(isRequiredProperty, value); }
    }

    public SuperTB()
    {
        InitializeComponent();
        myName = "Unicorns!";
    }

}

Это код, который StackOverflow передает его. Также не работает, но нет исключения:

public string myName = "Rainbows!";

1 Ответ

5 голосов
/ 29 июня 2011
 public string myName    
 {        
     get { return myName; }        
     set {}    
 }

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

и сеттер ничего не делает, поэтому "не работает"

вы вероятно хотите:

 private string myName; // lower case!
 public string MyName    // upper case!
 {        
     get { return myName; }        
     set { myName = value; }    
 }

или даже

 public string myName { get; set; }

и даже тогда это все равно не будет работать так, как вы ожидаете, поскольку ничто не вызывает там никаких уведомлений об изменении свойств, поэтому никто не заметит, что myName когда-либо изменится.

...