如何将DataTrigger设置为TextBox" Text"属性?

时间:2016-12-16 13:02:00

标签: c# wpf xaml datatrigger

如何将DataTrigger设置为TextBox" Text"属性? 我不想将DataTrigger设置为我的TextBox" Text"属性绑定到。

我有TextBox的样式。这个DataTrigger不起作用,我不知道为什么。

<Style x:Key="DatagridTextboxStyle" TargetType="TextBox">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Self}}" Value="0">
                <Setter Property="Text" Value="X"></Setter>
            </DataTrigger>
        </Style.Triggers>
</Style>

这是我的TextBox,它是DatagridCell的Tempate

<DataGridTemplateColumn Header="6">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Style="{StaticResource DatagridTextboxStyle}" IsReadOnly="true" Width="{Binding ElementName=AccRecOverdueTbl, Path=ActualWidth}" Text="{Binding AccountsReceivable.OverdueAtTheEndOfTheReportingPeriod, Mode=TwoWay}"></TextBox>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

1 个答案:

答案 0 :(得分:1)

这不起作用有两个原因。第一个也是最明显的一个是在DataTrigger绑定的setter中设置相同的属性会导致抛出StackOverflowException。设置Text属性,触发器触发,再次设置文本,触发器再次触发等等。

第二件事是本地值优先于样式设置器设置的值。因此,如果在DataGridColumn的CellTemplate中设置TextBox的Text属性,则样式设置器将无法“覆盖”此值。

当OverdueAtTheEndOfTheReportingPeriod源属性返回0时,您可以使用返回“X”的转换器。或者您可以向返回字符串并直接绑定到该字符串的类添加另一个源属性:

public string FormattedOverdueAtTheEndOfTheReportingPeriod
{
  get { return OverdueAtTheEndOfTheReportingPeriod == 0 ? "X" : OverdueAtTheEndOfTheReportingPeriod.ToString(); }
}

使用DataTrigger不是一种选择。