我正在尝试设置一个TextBox子类,它会根据一些不同的东西改变它的样式,而且我遇到了两个问题。第一个触发器,即VisualBrush触发器,可以正确触发,但不会在String 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!";
}
}
这是StackOverflows的代码。也没有工作,但没有例外:
public string myName = "Rainbows!";
答案 0 :(得分:5)
public string myName
{
get { return myName; }
set {}
}
属性getter返回本身,因此堆栈溢出。
并且setter什么都不做,因此“无法正常工作”
你可能想要:
private string myName; // lower case!
public string MyName // upper case!
{
get { return myName; }
set { myName = value; }
}
甚至
public string myName { get; set; }
即便如此,这仍然不会像你期望的那样工作,因为那里没有任何属性更改通知,所以没有人会注意到myName会发生变化。