2016-12-16 5 views
0

Как установить DataTrigger в свойство TextBox «Текст»? Я не хочу устанавливать DataTrigger в Свойство, к которому привязано свойство TextBox «Текст».Как установить DataTrigger в свойство TextBox «Текст»?

У меня есть стиль для 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, который является Tempate для 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> 
+0

Поскольку вы используете текст как цель, так и условие –

ответ

0

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

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

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

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

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

Смежные вопросы