WPF:在代码隐藏中设置触发器绑定

本文关键字:设置 触发器 绑定 隐藏 代码 WPF | 更新日期: 2023-09-27 18:36:18

我使用带有图标的矩形来显示计算的状态。我定义了一个带有数据触发器和绑定"IsComplete"的样式来处理计算状态(已完成/失败=未完成)。我现在有多个计算,并希望使用相同类型的矩形(都具有相同的样式和行为)进行多个计算。我知道如何为一个矩形设置一般的 IsDone 绑定。
如何在代码后面为特定矩形设置触发器的绑定(例如 computing1.iconStyle.IsComplete=true)?这是否可能,或者我是否必须为每个计算定义一种样式(这将是很多额外的代码)?

XAML:

<VisualBrush x:Key="NotCompleted" Stretch="Fill" Visual="{StaticResource appbar_error}" />
<VisualBrush x:Key="Completed" Stretch="Fill" Visual="{StaticResource appbar_check}" />
<Style x:Key="iconStyle" TargetType="{x:Type Rectangle}">
        <Setter Property="Width" Value="20"/>
        <Setter Property="Fill" Value="Red"/>
        <Setter Property="Height" Value="20"/>
        <Setter Property="Margin" Value="0,0,5,0"/>
        <Setter Property="OpacityMask" Value="{StaticResource NotCompleted}" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsCompleted}" Value="True">
                <Setter Property="Fill" Value="Green"/>
                <Setter Property="OpacityMask" Value ="{StaticResource Completed}"/>                    
            </DataTrigger>
        </Style.Triggers>
</Style>

叫:

<Rectangle Name="computation1"  Style="{StaticResource iconStyle}"  Grid.Column="0" VerticalAlignment="Top" />

代码隐藏:

public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
    private bool _isCompleted;
    public bool IsCompleted
    {
        get { return _isCompleted; }
        set { _isCompleted= value; NotifyPropertyChanged("IsCompleted"); }
    }
private bool comp1(){
  ....
  IsCompleted = !IsCompleted;
}

编辑:

示例输出:

分组框1:
|
-------------------------|计算1:(文本块)
|已完成或未完成的图标(矩形)
|平均值:(文本块)
|其他一些东西:
|
-------------------------分组框2:
|
-------------------------|计算 2:(文本块)
|已完成或未完成的图标(矩形)
|图表:(图片)
|其他一些东西:
|
-------------------------

WPF:在代码隐藏中设置触发器绑定

如果必须可视化多个计算的状态,则应具有绑定到计算数据项集合的 ItemsControls。

<ItemsControl ItemsSource="{Binding Computations}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Rectangle Style="{StaticResource iconStyle}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

计算项类可能如下所示:

public class Computation : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private bool isCompleted;
    public bool IsCompleted
    {
        get { return isCompleted; }
        set
        {
            isCompleted = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("IsCompleted"));
            }
        }
    }
}

并且可以像这样在 MainWindow 类中使用:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Computations = new ObservableCollection<Computation>();
        Computations.Add(new Computation());
        Computations.Add(new Computation());
        Computations.Add(new Computation());
        DataContext = this;
        Computations[1].IsCompleted = true;
    }
    public ObservableCollection<Computation> Computations { get; set; }
}

您可以在 MSDN 上的数据绑定概述和数据模板化概述文章中开始阅读所有这些内容。