我有下面的边框.为什么我的TextBlock的前景正常工作但边框的背景始终保持不变(就好像IsDeleted属性始终为false)
<Border DockPanel.Dock="Top" BorderBrush="Black" Background="#CBE2FF" BorderThickness="2" CornerRadius="5" Padding="0" Margin="5">
<Border.Style>
<Style TargetType="{x:Type Border}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsDeleted}" Value="True">
<Setter Property="Background" Value="#A00000"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<TextBlock Margin="5" FontWeight="Bold" FontSize="14" Text="Queue Details">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsDeleted}" Value="True">
<Setter Property="Foreground" Value="White"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Border>
Run Code Online (Sandbox Code Playgroud) 我目前有一个列表框,其选定的项目绑定到我的ViewModel上的属性.每当所选项目不为null时,我想在其上执行动画.但是,我不断收到以下错误"无法冻结此故事板时间轴树以供跨线程使用",并且从研究中了解为什么会发生这种情况.但是我不确定我需要采取什么方法来获得我想要的行为.
<Storyboard x:Key="ShowItemEdit">
<DoubleAnimation
Storyboard.TargetName="lstItemList"
Storyboard.TargetProperty="ListBox.Width"
To="{Binding ActualWidth, ElementName=UserControl}"
Duration="0:0:0.40" />
...
</Storyboard>
<Style x:Key="ListStyle">
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedItem, Converter={StaticResource IsNullConverter}}" Value="False">
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource ShowItemEdit}" />
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
<ListBox x:Name="lstItemList" Style={StaticResource ListStyle}" SelectedItem="{Binding SelectedItem}">
...
</ListBox>
Run Code Online (Sandbox Code Playgroud) 此代码有效(当ControlType ="dropDown"时,背景为黄色):
<Window x:Class="TestCollapsed.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:TestCollapsed.Commands"
Title="Main Window" Height="400" Width="800">
<Window.Resources>
<Style x:Key="DropDownStyle" TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding ControlType}" Value="dropDown">
<Setter Property="Background" Value="Yellow"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<TextBlock Visibility="Visible"
Text="This is going to be the dropdown control."
Style="{StaticResource DropDownStyle}"/>
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
但是这个代码不无法正常工作(当ControlType ="下拉列表",然后将TextBlock仍然是不可见的):
<Window x:Class="TestCollapsed.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:TestCollapsed.Commands"
Title="Main Window" Height="400" Width="800">
<Window.Resources>
<Style x:Key="DropDownStyle" TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding ControlType}" Value="dropDown">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<TextBlock Visibility="Collapsed" …Run Code Online (Sandbox Code Playgroud) 在WPF中,DataTrigger是否可以绑定到附加属性?
我本质上希望在附加属性上使用转换器,以在特定验证规则被破坏时提供样式.我正在使用如下标记:
<DataTrigger Binding="{Binding Path=Validation.Errors,
RelativeSource={RelativeSource Self},
Converter={StaticResource RequiredToBoolConverter}}"
Value="True">
<Setter Property="Background" Value="LightGreen" />
</DataTrigger>
Run Code Online (Sandbox Code Playgroud)
但是,当这运行时,我得到以下内容:
System.Windows.Data错误:39:BindingExpression路径错误:'object'''TextBox'(Name ='')'上找不到'Validation'属性.BindingExpression:路径= Validation.Errors; DataItem ='TextBox'(Name =''); target元素是'TextBox'(Name =''); target属性是'NoTarget'(类型'对象')
如果我将DataTrigger绑定路径更改为"Text",我不会得到数据绑定错误(但当然它不提供我正在寻找的行为).
假设我有以下简单类:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
public class PersonHolder
{
public Person CurrentPerson { get; set; }
public int ActiveId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我有类PersonHolder的实例为栅格DataContext,和在网格我有一个StackPanel被绑定到CurrentPerson的PersonHolder-表示它的数据:
<Grid>
<StackPanel x:Name="PersonPanel" DataContext="{Binding CurrentPerson}">
<TextBlock Text="{Binding Id}" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)
所以-这个问题:我如何给StackPanel在绿色背景CurrentPerson有一个Id匹配ActiveId的的PersonHolder(是的,非常有用的,但是这仅仅是一个非常简单的例子..).我的想法是,这是一个使用触发器的东西,但我可以在触发条件值中使用绑定吗?如果是这样我可以这样做:
<Grid x:Name="Foo">
<StackPanel x:Name="PersonPanel" …Run Code Online (Sandbox Code Playgroud) 这是我的情景.
我有2个属性.类型和状态.
类型是具有3个值的枚举,例如球,汽车,箭头.State是一个int,可以接受3个状态值,例如-1,0,1.另外,我有每个状态值的9个图像.
就像,如果我选择类型为球,值为-1,我想显示一个红色球.如果我选择类型为箭头并将值选为1,我想显示向上箭头.等等.,
我能够在WPF中做到这一点.我创建了3个带有空图像的DataTemplates.然后,我使用DataTrigger检查并更新所选StateValue的特定图像.
但是,在silverlight中我该怎么做呢.我知道,我必须在VSM中这样做.但是,我想知道关于这个(或)任何可用替代方案的更多细节.
我有一个TextBox,其样式有一个DataTrigger,用于更改文本,如下所示:
<Grid>
<TextBlock Text="Foo">
<TextBlock.Style>
<Style BasedOn="{StaticResource TextStyle}" TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding MyBool}" Value="True">
<Setter Property="Text" Value="Bar"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
Run Code Online (Sandbox Code Playgroud)
但它不起作用,文本永远不会变为"Bar".我已经使用Text ="{Binding MyBool}"测试了另一个TextBlock,此文本从"False"变为"True".Snoop没有发现我能看到的错误,输出中没有任何内容.
这个问题可能看起来像WPF触发器绑定到MVVM属性的重复,但我的代码似乎与接受的答案不同(http://www.thejoyofcode.com/Help_Why_cant_I_use_DataTriggers_with_controls_in_WPF.aspx,"使用样式"一节)任何相关的方式.并且在实际答案中建议使用DataTemplate似乎是错误的,因为我只希望将其应用于单个TextBlock,但如果它是正确的,我不知道如何为此编写DataTemplate ...
编辑:
这就是我绑定的属性看起来像:
public bool MyBool
{
get { return _myBool; }
set
{
if (_myBool== value)
return;
_myBool= value;
NotifyPropertyChanged();
}
}
private bool _myBool;
Run Code Online (Sandbox Code Playgroud) 注意我已经问过相关问题(有一个接受的答案):如何组合DataTrigger和Trigger?
我想我需要结合一个EventTrigger和一个DataTrigger来实现我所追求的目标:
目前我有一个如下所示的DataTemplate:
<DataTemplate DataType="{x:Type Notifications:NotificationViewModel}">
<Grid HorizontalAlignment="Stretch">
<Border Name="Background" CornerRadius="8" Background="#80c0c0c0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
<Border Name="Highlight" CornerRadius="8" Background="Red" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
<!-- snip actual visual stuff -->
<Grid.Triggers>
<EventTrigger RoutedEvent="Grid.Loaded">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation x:Name="LoadedAnimation"
Storyboard.TargetName="Highlight"
Storyboard.TargetProperty="Opacity"
From="0" To="1"
RepeatBehavior="5x"
Duration="0:00:0.2"
AutoReverse="True" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Grid.Triggers>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsCritical}" Value="True">
<Setter TargetName="LoadedAnimation" Property="RepeatBehavior" Value="5.5x" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
我们的想法是,在Highlight第一次加载项目时,EventTrigger会将边框的不透明度设置为0到1之间的动画,然后重复返回,从而吸引用户注意它.在DataTrigger确定的时间以动画的数目.如果视图模型报告该项目,IsCritical则动画发生5.5次(使其以不透明度1结束),否则发生5次(以不透明度0结束)
但是上面的XAML不起作用,因为DataTrigger的setter失败了:
在VisualTree中找不到名称为"LoadedAnimation"的子项. …
为什么我不能像这样编码
<Border Width="130" Height="70">
<Border.Triggers>
<DataTrigger Binding="{Binding Path=CurrentStatus}" Value="0">
<Setter Property="Style" Value="{StaticResource ResourceKey=ListBoxItemBorder}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=CurrentStatus}" Value="200">
<Setter Property="Style" Value="{StaticResource ResourceKey=ListBoxItemBorderInactive}"/>
</DataTrigger>
</Border.Triggers>
</Border>
Run Code Online (Sandbox Code Playgroud)
我收到这个错误
Failed object initialization (ISupportInitialize.EndInit).
Triggers collection members must be of type EventTrigger.
Error at object '4_T' in markup file
Run Code Online (Sandbox Code Playgroud)
我做错了什么错误的帮助.
我在数据网格中有一个“Delivery Boy”列,它与后面的代码列表绑定。DataGrid 的值动态变化。
<DataTrigger Binding="{Binding Path=delivery_boy}" Value="Not Assigned">
<Setter Property="Foreground" Value="DarkRed"/>
<Setter Property="Background" Value="Transparent"/>
</DataTrigger>
Run Code Online (Sandbox Code Playgroud)
我可以在数据触发器中使用“值”等于,如何在我希望“值”属性为“不等于”的情况下使用数据触发器
<DataTrigger Binding="{Binding Path=delivery_boy}" Value!="Not Assigned">
<Setter Property="Foreground" Value="White"/>
<Setter Property="Background" Value="Green"/>
</DataTrigger>
Run Code Online (Sandbox Code Playgroud) datatrigger ×10
wpf ×9
.net ×3
xaml ×3
binding ×2
c# ×2
data-binding ×2
animation ×1
border ×1
mvvm ×1
silverlight ×1
styles ×1
triggers ×1
vsm ×1
xml ×1