我知道我可以创建一个setter来检查一个值是否为NULL并执行某些操作.例:
<TextBlock>
<TextBlock.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding SomeField}" Value="{x:Null}">
<Setter Property="TextBlock.Text" Value="It's NULL Baby!" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
但是如何检查"非"值...如"NOT NULL"或"NOT = 3"?这可能在XAML中吗?
结果:感谢您的回答......我知道我可以做一个值转换器(这意味着我必须使用代码,这不是我希望的纯XAML).但是,这确实回答了在纯XAML中有效"不"你无法做到的问题.但是,选择的答案可能是创建这种功能的最佳方式.很好找.
以下DataTemplate.DataTrigger使年龄显示为红色,如果它等于 30.
如果年龄显示大于 30,如何使年龄显示为红色?
<DataTemplate DataType="{x:Type local:Customer}">
<Grid x:Name="MainGrid" Style="{StaticResource customerGridMainStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="150"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0" Text="First Name" Margin="5"/>
<TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding FirstName}" Margin="5"/>
<TextBlock Grid.Column="0" Grid.Row="1" Text="Last Name" Margin="5"/>
<TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding LastName}" Margin="5"/>
<TextBlock Grid.Column="0" Grid.Row="2" Text="Age" Margin="5"/>
<TextBlock x:Name="Age" Grid.Column="1" Grid.Row="2" Text="{Binding Age}" Margin="5"/>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Age}">
<DataTrigger.Value>30</DataTrigger.Value>
<Setter TargetName="Age" Property="Foreground" Value="Red"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud) 有没有办法对触发器的对象类型进行比较?
<DataTrigger Binding="{Binding SelectedItem}" Value="SelectedItem's Type">
</DataTrigger>
Run Code Online (Sandbox Code Playgroud)
背景:我有一个工具栏,我想要隐藏按钮,具体取决于当前为所选项目对象设置的子类.
谢谢
我有以下XAML:
<TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Margin="0,0,5,0"/>
<TextBlock Text="items selected">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Value="1">
<Setter Property="TextBlock.Text" Value="item selected"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
第一个文本块愉快地使用SelectedItems.Count更改,显示0,1,2等.第二个块上的数据触发器似乎永远不会触发更改文本.
有什么想法吗?
我遇到了一个情况,我可以用它来轻松实现相同的功能MultiDataTrigger,或者交替,使用DataTrigger了MultiBinding.是否有任何实质性理由偏好一种方法而不是另一种方法?
使用MultiDataTrigger:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=SomePath}" Value="SomeValue"/>
<Condition Binding="{Binding Path=SomeOtherPath, Converter={StaticResource SomeConverter}}" Value="SomeOtherValue"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MyStoryboard}"/>
</MultiDataTrigger.EnterActions>
</MultiDataTrigger>
Run Code Online (Sandbox Code Playgroud)
使用MultiBinding:
<DataTrigger Value="foo">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource fooConv}"/>
<Binding Path=SomePath/>
<Binding Path=SomeOtherPath/>
</MultiBinding>
</DataTrigger.Binding>
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MyStoryboard}"/>
</DataTrigger.EnterActions>
</DataTrigger>
Run Code Online (Sandbox Code Playgroud) 在WPF中,调试触发器的一些好方法是什么?
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="FontWeight" Value="Bold"/>
</Trigger>
Run Code Online (Sandbox Code Playgroud)
理想的情况是:
Debug在Visual Studio中写一条消息写入窗口;我创建了一个UserControl,类似于以下内容:
<UserControl>
<StackPanel Orientation="Vertical">
<StackPanel x:Name="Launch" Orientation="Horizontal" Visibility="Collapsed">
<!-- Children here -->
</StackPanel>
<ToggleButton x:Name="ToggleLaunch" IsChecked="False" Content="Launch" />
</StackPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
我一直在尝试使用DataTrigger使"启动"StackPanel在检查ToggleButton时变得可见,否则保持折叠状态.但是,在运行时我收到一条错误,指出"失败的对象初始化(ISupportInitialize.EndInit).触发器集合成员必须是EventTrigger类型".我已经尝试将它添加到UserControl和StackPanel的触发器集合中但没有成功.我的触发器XAML如下所示:
<DataTrigger Binding="{Binding ElementName=ToggleLaunch, Path=IsChecked}" Value="True">
<Setter TargetName="Launch" Property="UIElement.Visibility" Value="Visible" />
</DataTrigger>
Run Code Online (Sandbox Code Playgroud) 我正在尝试在datagrid单元格的值更改时在数据网格中的单元格上执行动画.
datagrid本身绑定到普通旧CLR对象的ObservableCollection.在这种情况下,假设对象是具有"名字","姓氏"和"年龄"属性的"人物"对象.'Person'类实现了INotifyPropertyChanged接口,每个属性都在其setter中对onPropertyChanged进行了适当的调用.
这一切都很好.在datagrid定义中,我设置了我的DataTemplate来绘制每个单元格并附加了一个datatrigger ......如下所示:
<DataGridTemplateColumn Header="FirstName">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border Name="templateBorder">
<TextBlock Name="templateTextBlock" Text="{Binding Path=FirstName}" />
</Border>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=FirstName}" Value="Richard">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard AutoReverse="True">
<DoubleAnimation Storyboard.TargetName="templateTextBlock" Storyboard.TargetProperty="Opacity" To=".1" Duration="0:0:.5" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)
当我的ObservableCollection中的对象更新(我更改了FirstName值)时,数据网格会更新.根据上面的例子,如果我将FirstName的值更改为'Richard',那么动画也可以正常执行.
我的问题是我需要运行我的动画,无论Firstname的新值是什么.我已经爬网了,但有些人似乎只能找到触发已知值的触发器的例子,例如当FirstName是'Richard'时触发,就像我在我的例子中所展示的那样.
我的问题是,无论更新属性的值如何,我如何触发数据触发器?因此,基本上如何在为数据网格中的给定行更新FirstName属性时触发数据触发器.
非常感谢.
datatrigger ×10
wpf ×10
xaml ×3
.net ×2
binding ×2
c# ×1
datagrid ×1
datatemplate ×1
multibinding ×1
multitrigger ×1
triggers ×1
types ×1
visibility ×1