DataTrigger的几个用法

1.用在textbox等输入控件上,验证输入是否合法。

<Window.Resources>
        <Style TargetType="TextBox">
            <Style.Triggers>
                <!--Binding属性会把数据源不断送过来,送过来的值与Value属性一致就被触发。-->
                <DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self},Path=Text.Length}" Value="0">
                    <!--这里使用RelativeSource将控件自己作为数据源,当文本框文本长度为0时触发-->
<!--也可以用Converter来转换成Bool值验证长度、格式(Convert方法中用正则表达式验证)等
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Text,Converter={StaticResource dc}}" Value="True">
-->
                    <Setter Property="BorderBrush" Value="Red"/>
                </DataTrigger>
            </Style.Triggers>
        </Style >
    </Window.Resources>

<TextBox Height="23" HorizontalAlignment="Left" Margin="50,66,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="50,108,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" />

 

运行结果:文本框文本长度为0,则显示设置的样式。

  

2.combox等列表控件里面,也可以用做数据筛选。

  对于集合数据或者列表数据,满足一定条件的就显示成另外一种样式。

 1)先添加一个转化器:

class Text2BoolConvert : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null) return false;
            if (string.IsNullOrEmpty(value.ToString())) return false;
            if (!Regex.IsMatch(value.ToString(), "^[1-9]\\d*$")) return false;

            return int.Parse(value.ToString()) < 100;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
View Code

2)映射命名空间,把转换器放在资源中:

xmlns:c="clr-namespace:WpfDemo.VelueConvert"

 <Window.Resources>
    <c:Text2BoolConvert x:Key="t2b"></c:Text2BoolConvert>
  </Window.Resources>

3)添加ComBox显示列表 

   <ComboBox Height="23" HorizontalAlignment="Left" Margin="334,83,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120">
<!--ItemTemplate-->
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel  Orientation="Horizontal" >
                        <TextBlock  Text="{Binding Display}" Name="t1"></TextBlock>
                        <TextBlock Text="--" Name="t2"/>
                        <TextBlock   Text="{Binding Tag}" Name="t3"></TextBlock>
                    </StackPanel>
<!--DataTrigger -->
                    <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Path=Tag,Converter={StaticResource t2b}}" Value="True">
                            <Setter  Property="Foreground"  TargetName="t1" Value="Red" />
                            <Setter  Property="Foreground"  TargetName="t2" Value="Red" />
                            <Setter  Property="Foreground"  TargetName="t3" Value="Red" />
                        </DataTrigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
View Code

4)在Window加载的时候给ComBox指定数据源 

 List<object> objList = new List<object>();
             for (int i = 0; i < 200; i += 10)
             {
                 objList.Add(new { Display = "d" + i.ToString(), Tag = i.ToString() });
             }
 
             comboBox1.ItemsSource = objList;

 

3.特殊状态的样式

<!--EditMode的背景--> 
<UserControl.Resources>
        <Style x:Key="menuText" TargetType="TextBlock" >
            <Style.Triggers>
<!--设置修改时候的样式-->
                <DataTrigger Binding="{Binding EditMode}" Value="0">
                    <Setter Property="Foreground" Value="DimGray" />
                </DataTrigger>
            </Style.Triggers>
            <Setter Property="FontSize" Value="13" />
        </Style>
 </UserControl.Resources>

 

posted @ 2013-09-16 17:46  Lynn_  Views(3331)  Comments(0Edit  收藏  举报