C# WPF 数据触发器

Posted

技术标签:

【中文标题】C# WPF 数据触发器【英文标题】:C# WPF DataTrigger 【发布时间】:2021-12-20 10:01:07 【问题描述】:

我想为每个灌装机制作状态指示器。当灌装机处于停止模式时,它会将颜色变为红色,但当灌装机运行时,它会变为绿色。 对于每一行,我们有两个填充物,所以我尝试使用 datatrigger 进行设置,但现在不知道如何为两个边框编程 trigger/s,因为它们使用相同的属性。

Fillers are in stop mode Filler 1 is running.

        <DataTrigger Binding="Binding LineStatus" Value="True">
        <Setter Property="BorderBrush" Value="Red"/>
    </DataTrigger>
    <DataTrigger Binding="Binding LineStatus2" Value="True">
        <Setter Property="BorderBrush" Value="Red"/>
    </DataTrigger>

边框代码

                            <StackPanel Orientation="Horizontal" >

                            <Border
                                 BorderBrush="TemplateBinding BorderBrush"
                                    BorderThickness="4"                                       
                                    CornerRadius="5,0,0,5"
                                    Width="40"
                                    />
                                <Border
                                    BorderBrush="TemplateBinding BorderBrush"
                                    BorderThickness="4"                                       
                                    CornerRadius="0,5,5,0"                                            
                                    Width="40"

                                    />
                            </StackPanel>

【问题讨论】:

你说他们使用相同的属性。但是您的代码显示您使用了两个差异。属性 LineStatus 和 LineStatus2。我在这里错过了什么吗? 有了属性,我在想这个 - Property="BorderBrush" 【参考方案1】:

我认为这就是您想要实现的目标。

<StackPanel Orientation="Horizontal">

    <Border BorderThickness="4"
            CornerRadius="5 0 0 5"
            Width="40">
        <Border.Style>
            <Style TargetType="Border">

                <!-- "Put your default color here." -->
                <Setter Property="BorderBrush" Value="Orange" />

                <Style.Triggers>
                    <DataTrigger Binding="Binding LineStatus,
                                            UpdateSourceTrigger=PropertyChanged,
                                            FallbackValue='False'"
                                            Value="True">

                        <!-- "Color to change to when LineStatus = True ." -->
                        <Setter Property="BorderBrush" Value="Red" />

                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Border.Style>
    </Border>
    <Border BorderThickness="4"
            CornerRadius="5 0 0 5"
            Width="40">
        <Border.Style>
            <Style TargetType="Border">

                <!-- "Put your default color here" -->
                <Setter Property="BorderBrush" Value="Orange" />

                <Style.Triggers>
                    <DataTrigger Binding="Binging LineStatus1,
                                            UpdateSourceTrigger=PropertyChanged,
                                            FallbackValue='False'"
                                            Value="True">

                        <!-- "Color to change to when LineStatus1 = True ." -->
                        <Setter Property="BorderBrush" Value="Red" />

                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Border.Style>
    </Border>

</StackPanel>

当 LineStatus 和 LineStatus1 的值发生变化时,后面的代码需要实现 INotifyPropertyChanged 来更新 UI。

public partial class MainWindow : Window, INotifyPropertyChanged


    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName] string propertyname = null)
    

        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));

    

    private bool _lineStatus = false;
    public bool LineStatus
    

        get  return _lineStatus; 
        set
        

            _lineStatus = value;
            OnPropertyChanged();

        

    

    private bool _lineStatus1 = false;
    public bool LineStatus1
    

        get  return _lineStatus1; 
        set
        

            _lineStatus1 = value;
            OnPropertyChanged();
        
    

    public MainWindow()
    

        InitializeComponent();

        LineStatus = false;
        LineStatus1 = true;

    

【讨论】:

谢谢你拯救了我的一天!奇迹般有效。如果有人想使用它,那只是代码中的小错误。 - '

以上是关于C# WPF 数据触发器的主要内容,如果未能解决你的问题,请参考以下文章

Zara带你快速入门WPF---触发器篇

C# WPF 数据绑定DataContext;Window_Loaded时进行过数据绑定,指定DataContext;触发另一事件?

c# wpf grid - SelectedCellsChanged 不会为同一行中的单元格触发

做WPF页面的时候我想通过C#代码触发自定义控件中的事件怎么做

WPF 从代码触发动画

WPF 精修篇 数据触发器