【问题标题】:WPF: set trigger binding in code behindWPF:在后面的代码中设置触发器绑定
【发布时间】:2013-10-29 22:30:33
【问题描述】:

我使用一个带有图标的矩形来显示计算的状态。我定义了一个带有数据触发器和绑定“IsCompleted”的样式来处理计算的状态(完成/失败=未完成)。我现在有不止一个计算,并且想使用相同类型的矩形(都具有相同的样式和行为)进行不止一个计算。 我知道通常如何为一个矩形设置 IsCompleted 的绑定。
如何在特定矩形后面的代码中设置触发器的绑定(例如,computation1.iconStyle.IsCompleted=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:(文本块)
|已完成或未完成的图标(矩形)
|图表:(图片)
|其他一些东西:
| -------------------------

【问题讨论】:

  • 为什么需要在代码隐藏中设置相同的触发器...触发器将应用于您设置 iconStyle 的任何矩形
  • 但不同的计算可能有不同的最终结果,所以有些可能完成,有些失败(未完成)。那么是否可以为不同的图标设置不同的 IsCompleted 状态?或者这是不可能的?
  • 是的.. 每个矩形都会从其数据上下文中查找 IsCompleted 的状态,因此它们将独立行动...
  • 好的,但是如何设置 IsCompleted?在我上面的代码中,它只是我的通用类中的通用调用(全局属性),没有分配给任何矩形或图标。
  • 那么如果你只有一个全局属性,它怎么能控制多个计算状态呢?

标签: c# wpf xaml binding triggers


【解决方案1】:

如果您必须可视化多个计算的状态,您应该有一个绑定到计算数据项集合的 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 上的 Data Binding OverviewData Templating Overview 文章中开始阅读所有这些内容。

【讨论】:

  • 哇,这真是一个高级版本。更多的 Computations.Add(new Computation());我这样做了,我生成的图标越多。但我认为这个图标总是放在一个堆栈中,我不能将单个项目放在特殊位置?这是正确的吗?请查看我的编辑以获取输出示例。
  • 编写一个适合您需求的 DataTemplate。 Data Templating Overview 文章中也对此进行了解释。默认情况下,ItemsControl 使用(垂直)StackPanel。但是,您可以更改它的 ItemsPanel 属性,该文章也显示了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 2011-06-25
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多