我的尝试(如下)失败了:
<Canvas x:Key="Lock" ... />
<Canvas x:Key="解锁" ... />
<Style x:Key="LockButtonStyle" TargetType="{x:Type Button}">
<样式.触发器>
<DataTrigger Binding="{Binding Path=IsReadOnly}" Value="True">
<DataTrigger.Setters>
<Setter Property="Content" Value="{StaticResource Lock}" />
</DataTrigger.Setters>
</数据触发器>
<DataTrigger Binding="{Binding Path=IsReadOnly}" Value="False">
<DataTrigger.Setters>
<Setter Property="Content" Value="{StaticResource Unlock}" />
</DataTrigger.Setters>
</数据触发器>
</Style.Triggers>
</样式>
...
<Button Content="{StaticResource Lock}" />
我试图让按钮在 ViewModel 上的 IsReadOnly 属性更改时更改(它以“IsReadOnly”作为 PropertyName 触发 INotifyPropertyChanged.PropertyChanged)。我错过了什么?
.NET 3.5
答案(至少对我来说 - 不支持一般情况):
我刚刚为布尔属性绑定编写了一个快速转换器。
[ValueConversion(typeof(bool), typeof(object))]
公共类 BooleanValueConverter : IValueConverter
{
公共对象 FalseValue { 获取;放; }
公共对象 TrueValue { 获取;放; }
#region IValueConverter 成员
公共对象转换(对象值,类型目标类型, … 我有像这样的const字段的类
Areas
{
public const int Area1Id = 1;
public const int Area2Id = 2;
public const int Area3Id = 3;
}
Run Code Online (Sandbox Code Playgroud)
还有一个绑定到Area类的模板.Area类有int TypeId属性,我想根据TypeId属性显示不同的东西
像这样的代码完美无缺
<DataTrigger Binding="TypeId" Value="1" >
...
</DataTrigger>
<DataTrigger Binding="TypeId" Value="2" >
...
</DataTrigger>
<DataTrigger Binding="TypeId" Value="3" >
...
</DataTrigger>
Run Code Online (Sandbox Code Playgroud)
现在我的问题是如何设置我的const值而不是DataTrigger值
<DataTrigger Binding="TypeId" Value="can i bind to Areas.Area1Value?" >
...
</DataTrigger>
Run Code Online (Sandbox Code Playgroud) 我有一个ObservableCollection<Object1>类型(Messages在下面的代码中)绑定到一个ItemsControl.Object1有两个属性即ErrMsg和IsError.ErrMsg如果是错误(即如果IsError是),我想显示红色,否则显示黑色.
<ItemsControl
Height="Auto"
Background="White"
ItemsSource="{Binding Messages}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock
Margin="5,0,0,0"
Text="{Binding ErrMsg}"
Width="Auto"
Foreground="Black">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger
Binding="{Binding IsError}"
Value="true">
<Setter
Property="TextBlock.Foreground"
Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
问题是所有的消息总是以黑色显示而不管IsError价值如何?
我怎样才能做到这一点?
我正在尝试设置一个TextBox子类,它将根据一些不同的东西改变它的样式,我遇到了两个问题.第一个触发器,即VisualBrush触发器,可以正确触发,但不会在String myName中写入文本.我尝试将myName设为属性但由于某种原因set方法抛出StackOverFlowException.
第二个问题是DataTrigger,即使isRequired设置为false,也不会被触发.
这都在继承TextBox的自定义控件中.
这是我的XAML:
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Text" Value="">
<Setter Property="Background">
<Setter.Value>
<VisualBrush Stretch="None">
<VisualBrush.Visual>
<TextBlock Foreground="Gray" FontSize="24">
<TextBlock.Text>
<Binding Path="myName" RelativeSource="{RelativeSource Self}" />
</TextBlock.Text>
</TextBlock>
</VisualBrush.Visual>
</VisualBrush>
</Setter.Value>
</Setter>
</Trigger>
<DataTrigger Binding="{Binding Path=isRequired, Source={RelativeSource Self}}" Value="False">
<Setter Property="Text" Value="100" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
Run Code Online (Sandbox Code Playgroud)
CS:
public partial class SuperTB : TextBox
{
public String myName
{
get { return myName; }
set {}
}
DependencyProperty isRequiredProperty = DependencyProperty.Register("isRequired", typeof(Boolean), typeof(SuperTB));
public Boolean isRequired
{
get { …Run Code Online (Sandbox Code Playgroud) 这里的目标是在标题复选框更改时检查所有网格复选框:
<Window.Resources>
<Style TargetType="CheckBox" x:Key="InnerBox">
<Setter Property="HorizontalAlignment" Value="Center" />
<Style.Triggers>
<DataTrigger Value="True"
Binding="{Binding IsChecked,
ElementName=HeaderCheckbox}">
<Setter Property="IsChecked" Value="True" />
</DataTrigger>
<DataTrigger Value="False"
Binding="{Binding IsChecked,
ElementName=HeaderCheckbox}">
<Setter Property="IsChecked" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<DataGrid>
<DataGrid.Columns>
<!-- col1 -->
<DataGridTemplateColumn>
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<!-- header check -->
<CheckBox Name="HeaderCheckbox" />
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<!-- body check -->
<CheckBox Style="{StaticResource InnerBox}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!-- col2 -->
<DataGridTextColumn Binding="{Binding}" Header="Text" />
</DataGrid.Columns>
<!-- sample data -->
<sys:String>1</sys:String>
<sys:String>2</sys:String>
<sys:String>3</sys:String>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
好像: …
我试图在单击“显示详细信息”/“隐藏详细信息”按钮时切换高度动画,然后在再次单击该按钮时返回其初始值。
我有一个带有预定义样式的 DataControls:DataForm,我希望在单击按钮时将“高度”属性设置为更大的值。
DataControl:Dataform 看起来像这样。
<DataControls:DataForm x:Name="DataEdit"
Grid.Row="1"
ItemsSource="{Binding}"
Style="{DynamicResource CommonDataFormStyle}"
ContentLoaded="OnContentLoaded"
Height="150">
Run Code Online (Sandbox Code Playgroud)
按钮本身就在这样的 DataForm 中。
<DataControls:DataForm.ReadOnlyTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>...
<StackPanel Grid.Column="0" Grid.Row="0">
<Button Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl} }, Path=DataContext.ToggleDetailsCommand, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" x:Name="ToggleDetailsButton"
Content="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl} }, Path=DataContext.ToggleDetailsButtonText}"/>
...
Run Code Online (Sandbox Code Playgroud)
我只是通过使用一个名为“显示详细信息”的标签和一个标签上的 RoutedEvent="Label.MouseLeftButtonDown" 事件触发器来扩展详细信息。然后使用另一个名为“隐藏详细信息”的标签来再次切换动画。
我也尝试将这种样式放在按钮上,并尝试使用数据触发器来切换动画。但是,无论 StoryBoard.Target="{Binding ElementName=DataEdit}" 属性如何,这只会为按钮的高度设置动画。
<Style TargetType="{x:Type Button}" x:Key="ExpandDetailsStyle" >
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl} }, Path=DataContext.IsOpened}" Value="true">
<DataTrigger.EnterActions>
<StopStoryboard BeginStoryboardName="EndAnimation" />
<BeginStoryboard Name="NewAnimation">
<Storyboard>
<DoubleAnimation Storyboard.Target="{Binding ElementName=DataEdit}" Storyboard.TargetProperty="Height" From="150" To="300" Duration="0:0:0.1" />
</Storyboard> …Run Code Online (Sandbox Code Playgroud) 我试图DataTrigger在Xamarin Forms页面的XAML中使用一个简单的元素:
<Frame BackgroundColor="Red" HorizontalOptions="Fill" VerticalOptions="FillAndExpand">
<Frame.Triggers>
<DataTrigger TargetType="Frame" Binding="{Binding IsValid}" Value="True">
<Setter Property="BackgroundColor" Value="{x:Static Color.Lime}" />
</DataTrigger>
</Frame.Triggers>
</Frame>
Run Code Online (Sandbox Code Playgroud)
此配置会使应用程序崩溃,实际上是NullReferenceException:
Java.Lang.NullPointerExceptionAttempt在空对象引用上调用虚方法'boolean android.graphics.Bitmap.isMutable()'
如果我Setter在上面的示例中注释掉,应用程序正常运行,但当然,触发器不起作用.
任何人都可以建议我做错了什么?
我试图让这个答案工作,但我得到错误The property "Style" can only be set once..这是为什么?
这就是我所拥有的:
<UserControl x:Class="SFVControls.Controls.Basic.BooleanRectangleView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="20" d:DesignWidth="40">
<StackPanel Name="stackTextPanel" Orientation="Horizontal">
<StackPanel.Style>
<Setter Property="Margin" Value="0,8,0,0" />
<Style TargetType="{x:Type StackPanel}">
<Style.Triggers>
<DataTrigger Binding="{Binding QuickDrawBarPinned}" Value="False">
<Setter Property="Margin" Value="0,8,0,0" />
</DataTrigger>
<DataTrigger Binding="{Binding QuickDrawBarPinned}" Value="True">
<Setter Property="Margin" Value="0,48,0,0" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
</StackPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud) 我正在努力弄清楚如何检查字符串是否包含某些字符/单词并基于此使数据触发器关闭。
在下面的示例中,我希望数据触发器在值中有颜色时关闭,后面的内容无关紧要。第一个触发器,如果 value 包含“RED”触发器应该关闭,无论它是 RED Apple,RED car,RED little ball 等。
<DataTrigger Binding="{Binding Name}" Value="RED Apple" >
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
<DataTrigger Binding="{Binding Name}" Value="YELLOW Lemon" >
<Setter Property="Foreground" Value="Yellow" />
</DataTrigger>
<DataTrigger Binding="{Binding Name}" Value="GREEN Pear" >
<Setter Property="Foreground" Value="Green" />
</DataTrigger>
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点
如果我将DataTrigger放在一个简单的Listbox中,我会得到这个运行时异常:
在使用ItemsSource之前,项集合必须为空
我没有datatrigger的列表框(没有例外):
<ListBox ItemsSource="{Binding EdgedBoards}" SelectedItem="{Binding SelEdgedBoard, Mode=TwoWay}" DisplayMemberPath="Name">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}"
BasedOn="{StaticResource {x:Type ListBoxItem}}">
<Setter Property="IsSelected"
Value="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
我的ListBox包含DataTrigger:
<ListBox ItemsSource="{Binding EdgedBoards}" SelectedItem="{Binding SelEdgedBoard, Mode=TwoWay}" DisplayMemberPath="Name">
<Style TargetType="{x:Type ListBox}" BasedOn="{StaticResource {x:Type ListBox}}">
<Setter Property="Focusable" Value="True" />
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=EdgedBoardsAdd_UC, Path=Visibility}" Value="Visible">
<Setter Property="Focusable" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
后一个代码有什么问题?
datatrigger ×10
wpf ×9
c# ×6
xaml ×4
.net ×2
animation ×1
binding ×1
data-binding ×1
datagrid ×1
itemscontrol ×1
listbox ×1
storyboard ×1
styles ×1
triggers ×1
xamarin ×1