Как установить DataTrigger в свойство TextBox Text?

Как установить DataTrigger в свойство TextBox «Текст»? Я не хочу устанавливать 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.

<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>

person Mrg Gek    schedule 16.12.2016    source источник
comment
Поскольку вы используете текст как цель и условие   -  person Leonid Malyshev    schedule 16.12.2016


Ответы (1)


Это не работает по двум причинам. Первый и наиболее очевидный из них заключается в том, что установка того же свойства в установщике, к которому привязан DataTrigger, вызовет исключение StackOverflowException. Свойство Text устанавливается, триггер срабатывает, этот текст снова устанавливается, триггеры срабатывают снова и так далее.

Во-вторых, локальные значения имеют приоритет над значениями, установленными установщиками стиля. Поэтому, если вы установите свойство Text TextBox в CellTemplate DataGridColumn, установщик Style никогда не сможет «переопределить» это значение.

Вместо этого вы можете использовать преобразователь, который возвращает «X», когда исходное свойство OverdueAtTheEndOfTheReportingPeriod возвращает 0. Или вы можете добавить другое исходное свойство в класс, который возвращает строку, и напрямую привязываться к этому:

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

Использование DataTrigger не вариант.

person mm8    schedule 17.12.2016