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:(文本块)
|已完成或未完成的图标(矩形)
|图表:(图片)
|其他一些东西:
|
-------------------------
如果必须可视化多个计算的状态,则应具有绑定到计算数据项集合的 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 上的数据绑定概述和数据模板化概述文章中开始阅读所有这些内容。