让TextBox在ModelView中显示基于bool的消息的最佳方法

时间:2011-06-10 17:14:50

标签: wpf textbox adorner

我有一个需要更改边框颜色的TextBox,然后在文本框下面显示一条消息。应根据模型中的bool值显示/隐藏此消息。实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

有很多不同的方法可以做到这一点。如果您只打算这样做一次,最简单的方法是将TextBlock添加到布局中并使用样式来隐藏它,例如:

<StackPanel>
   <TextBox Text="{Binding Text, Mode=TwoWay}">
      <TextBox.Style>
         <Style TargetType="TextBox">
            <Setter Property="BorderBrush" Value="Lightgray"/>
            <Style.Triggers>
               <DataTrigger Binding="{Binding IsValid}" Value="False">
                  <Setter Property="BorderBrush" Value="Red"/>
               </DataTrigger>
            </Style.Triggers>
         </Style>
      </TextBox.Style>
   </TextBox>
   <TextBlock Text="This is the message displayed if IsValid is false.">
      <TextBlock.Style>
         <Style TargetType="TextBlock">
            <Setter Property="Visibility" Value="Collapsed"/>
            <Style.Triggers>
               <DataTrigger Binding="{Binding IsValid}" Value="False">
                  <Setter Property="Visibility" Value="Visible"/>
               </DataTrigger>
            </Style.Triggers>
         </Style>
       </TextBlock.Style>
   </TextBlock>
</StackPanel>

如果您希望能够重复此操作,则需要将其设置为模板或用户控件。

另外,请注意,将可见性从折叠更改为可见将更改整体布局,这可能会产生各种不良影响。根据您的设计,您可能会将可见性默认为隐藏。

答案 1 :(得分:0)

您可以使用DataTrigger根据ViewModel中的值设置文本框的文本,可见性和外观。这似乎是最简单的解决方案。

<TextBox>
   <TextBox.Style>
       <Style TargetType="TextBox">
           <Style.Triggers>
                <DataTrigger Binding="{Binding Path=TheBoolean}" Value="True">
                     <Setter Property="Visibility" Value="Visible" />
                     <Setter Property="Background" Value="Red" />
                     ...
                </DataTrigger>
           </Style.Triggers>
       </Style>
   </TextBox.Style>
</TextBox>

另一种选择是创建IValueConverter来转换bool以获取文本,可见性和颜色。