标签: datatrigger

WPF 更改 ViewModel.PropertyChanged 事件上的按钮内容

我的尝试(如下)失败了:

<Canvas x:Key="Lock" ... />
<Canvas x:Key="解锁" ... />

<Style x:Key="LockButtonStyle" TargetType="{x:Type Button}">
    <样式.触发器>
        <Da​​taTrigger Binding="{Binding Path=IsReadOnly}" Value="True">
            <Da​​taTrigger.Setters>
                <Setter Property="Content" Value="{StaticResource Lock}" />                           
            </DataTrigger.Setters>
        </数据触发器>
        <Da​​taTrigger Binding="{Binding Path=IsReadOnly}" Value="False">
            <Da​​taTrigger.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 成员

    公共对象转换(对象值,类型目标类型, …

.net wpf triggers datatrigger

2
推荐指数
1
解决办法
3562
查看次数

如何将DataTrigger值设置为const字段?

我有像这样的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)

c# wpf binding datatrigger

2
推荐指数
1
解决办法
1306
查看次数

Textblock Style dataTrigger在ItemsControl中不起作用

我有一个ObservableCollection<Object1>类型(Messages在下面的代码中)绑定到一个ItemsControl.Object1有两个属性即ErrMsgIsError.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价值如何?

我怎样才能做到这一点?

.net wpf styles datatrigger itemscontrol

2
推荐指数
1
解决办法
3414
查看次数

WPF触发器/绑定无法正常工作

我正在尝试设置一个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)

c# data-binding wpf xaml datatrigger

2
推荐指数
1
解决办法
900
查看次数

CellTemplate 中的 DataTrigger 绑定到 HeaderTemplate;它可以工作吗?

这里的目标是在标题复选框更改时检查所有网格复选框:

<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)

好像: …

wpf datagrid datatrigger

2
推荐指数
1
解决办法
1931
查看次数

在切换时触发大小动画

我试图在单击“显示详细信息”/“隐藏详细信息”按钮时切换高度动画,然后在再次单击该按钮时返回其初始值。

我有一个带有预定义样式的 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)

c# wpf animation datatrigger storyboard

2
推荐指数
1
解决办法
1396
查看次数

Xamarin Forms DataTrigger导致NullReferenceException

我试图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在上面的示例中注释掉,应用程序正常运行,但当然,触发器不起作用.

任何人都可以建议我做错了什么?

datatrigger xamarin.android xamarin xamarin.forms

2
推荐指数
1
解决办法
372
查看次数

"风格"属性只能设置一次

我试图让这个答案工作,但我得到错误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)

c# wpf xaml datatrigger

2
推荐指数
1
解决办法
358
查看次数

Datatrigger 如果字符串包含某些字符

我正在努力弄清楚如何检查字符串是否包含某些字符/单词并基于此使数据触发器关闭。

在下面的示例中,我希望数据触发器在值中有颜色时关闭,后面的内容无关紧要。第一个触发器,如果​​ 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)

我怎样才能做到这一点

c# wpf xaml datatrigger

2
推荐指数
1
解决办法
4324
查看次数

在使用ItemsSource之前,项集合必须为空

如果我将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)

后一个代码有什么问题?

c# wpf xaml listbox datatrigger

1
推荐指数
1
解决办法
8785
查看次数