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

C# WPF:在代码隐藏中设置触发器绑定,c#,wpf,xaml,binding,triggers,C#,Wpf,Xaml,Binding,Triggers,我使用一个带有图标的矩形来显示计算的状态。我定义了一个带有datatrigger和绑定“IsCompleted”的样式来处理计算状态(completed/failed=notcompleted)。我现在有不止一个计算,并且希望使用同一类型的矩形(所有矩形都具有相同的样式和行为)进行不止一个计算。 我知道如何为一个矩形设置IsCompleted的绑定。 如何在特定矩形的代码隐藏中设置触发器的绑定(如computation1.iconStyle.IsCompleted=true)?这是可能的,还是我

我使用一个带有图标的矩形来显示计算的状态。我定义了一个带有datatrigger和绑定“IsCompleted”的样式来处理计算状态(completed/failed=notcompleted)。我现在有不止一个计算,并且希望使用同一类型的矩形(所有矩形都具有相同的样式和行为)进行不止一个计算。 我知道如何为一个矩形设置IsCompleted的绑定。
如何在特定矩形的代码隐藏中设置触发器的绑定(如computation1.iconStyle.IsCompleted=true)?这是可能的,还是我必须为每个计算定义一种样式(这将是大量额外的代码)

xaml:

编辑:

示例输出:

groupbox1:
|---------------------------
|计算1:(文本块)
|已完成或未完成的图标(矩形)
|平均值:(文本块)
|其他一些东西:
|---------------------------
groupbox2:
|---------------------------
|计算2:(文本块)
|已完成或未完成的图标(矩形)
|图:(图像)
|其他一些东西:

|----------------------------

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

<ItemsControl ItemsSource="{Binding Computations}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Rectangle Style="{StaticResource iconStyle}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
并且可以在MainWindow类中使用,如下所示:

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"));
            }
        }
    }
}
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; }
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
计算=新的可观测集合();
添加(新计算());
添加(新计算());
添加(新计算());
DataContext=this;
计算[1]。IsCompleted=true;
}
公共可观测集合计算{get;set;}
}

您可以在MSDN的和文章中开始阅读所有这些内容。

为什么需要在codebehind中设置相同的触发器。。。触发器将应用于在其上设置IConStyle的任何矩形,但不同的计算可能会有不同的最终结果,因此有些计算可能已完成,有些计算可能已失败(未完成)。那么,是否可以为不同的图标设置不同的IsCompleted状态?或者这是不可能的?是的。。每个矩形都会从其datacontext中查找IsCompleted的状态,这样它们就可以独立运行了……好的,但是如何设置IsCompleted?在我上面的代码中,它只是我的通用类中的一个通用调用(全局属性),没有分配给任何矩形或图标。因此,如果您只有一个全局属性,它如何控制多个计算状态?哇,这真是一个高级版本。增加(新计算());是的,我生成的图标越多。但我认为这些图标总是放在一个堆叠的下面,我不能把单个项目放在特殊的位置?是这样吗?有关输出示例,请参见我的编辑。编写一个适合您需要的数据模板。文章中也解释了这一点。默认情况下,ItemsControl使用(垂直)StackPanel。但是,您可以更改其ItemsPanel属性,该属性也显示在该文章中。
<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"));
            }
        }
    }
}
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; }
}