2016-12-16 70 views
0

如何将DataTrigger设置为TextBox“Text”属性? 我不想将DataTrigger设置为TextBox“Text”属性绑定到的属性。如何将DataTrigger设置为文本框“文本”属性?

我有一个文本框的样式。这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> 

这是我的文本框是一个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

这并不原因有二。第一个也是最明显的一点是,在setter中设置与DataTrigger绑定的相同属性将导致引发StackOverflowException。 Text属性被设置,触发器触发,文本被重新设置,触发器再次触发等等。

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

你也可以使用当OverdueAtTheEndOfTheReportingPeriod源属性返回0。或者你可以另一个来源属性添加到返回一个字符串类和绑定到这个一个直接返回“X”转换器:

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

使用DataTrigger不是一个选项。

相关问题