【问题标题】:Using DataTrigger with more than one values in WPF在 WPF 中使用具有多个值的 DataTrigger
【发布时间】:2012-04-29 17:48:50
【问题描述】:

我使用的 XAML 代码部分是

<DataTrigger Binding="{Binding Path=Name}" Value="1">
    <Setter Property="Header" TargetName="expanderHeader" Value="Course Text"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Name}" Value="2">
    <Setter Property="Header" TargetName="expanderHeader" Value="Media Lecture"/>
</DataTrigger>
<DataTrigger    Binding="{Binding Path=Name}" Value="3">
    <Setter Property="Header" TargetName="expanderHeader" Value="Assessment"/>

<DataTrigger Binding="{Binding Path=Name}" Value="4">
    <Setter Property="Header" TargetName="expanderHeader" Value="Question"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Name}" Value="5">
    <Setter Property="Header" TargetName="expanderHeader" Value="General"/>
</DataTrigger>

现在我想使用一个 dataTrigger,它的值可以是 3、301、302 或 303。我该怎么做。 我尝试使用 Multidatatrigger,但它不起作用。我尝试使用 Multidatatrigger 的代码是:

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding Path=Name}" Value="301"/>
        <Condition Binding="{Binding Path=Name}" Value="301"/>
        <Condition Binding="{Binding Path=Name}" Value="302"/>
        <Condition Binding="{Binding Path=Name}" Value="303"/>
        </MultiDataTrigger.Conditions>
    <Setter Property="Header" TargetName="expanderHeader" Value="Assessment"/>
</MultiDataTrigger>

【问题讨论】:

  • 你想实现wid数据触发吗?
  • @user1341006 你的属性Name怎么能同时有5个不同的值??

标签: c# wpf xaml triggers multidatatrigger


【解决方案1】:

MultiDataTrigger 在满足所有条件而不是任何时应用,这就是您的 MultiDataTrigger 不起作用的原因。

要么有四个单独的触发器,要么将条件放入单独的布尔属性中,例如

bool ShowAssessment
{
    return Value == 301 || Value == 302 ...
}

当值更改时,为 ShowAssessment 发出属性更改通知

例如

int Value { 
    get{ return _value; } 
    set { 
        _value = value; 
        RaisePropertyChanged("Value");
        RaisePropertyChanged("ShowAssessment");
    }
}

然后在 ShowAssessment 上触发。

可能更好的解决方案是添加一个带有 switch 语句的 HeaderText 属性,该语句根据 Value 返回正确的标题文本。然后只需将标题的文本绑定到那个。无需触发器。

【讨论】:

  • 我希望在任何一个值满足时应用触发器。我只想要一个触发器而不使用四个触发器。
  • 我的回答中有几个解决方案。您的四个值的一个触发器,或者通过将逻辑移动到视图模型中没有触发器。
【解决方案2】:

MultidataTrigger 将在所有条件都满足时动作。所以

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding Path=Prop1}" Value="301"/>
        <Condition Binding="{Binding Path=Prop2}" Value="301"/>
        <Condition Binding="{Binding Path=Prop3}" Value="302"/>
        <Condition Binding="{Binding Path=Prop4}" Value="303"/>
    </MultiDataTrigger.Conditions>
    <Setter Property="Header" TargetName="expanderHeader" Value="Assessment"/>
</MultiDataTrigger>

您将需要一个 DataTrigger

<DataTrigger Binding="{Binding Path=ConditionEnum}" Value="1">
    <Setter Property="Header" TargetName="expanderHeader" Value="Course Text"/>
</DataTrigger>

在代码中使用定义的逻辑设置枚举的值...

示例:

Validate()
{
    if(Value == 301 || Value == 302|| ....)
    {
        ConditionEnum = MyEnum.Assessment;
    }
    //Other Conditions
}

我将离开 INotifyPropertyChanged 的实现。使用它来提供更改通知。

【讨论】:

  • 如果值为 3、301、302 或 303,我想要它。我该怎么做?
猜你喜欢
  • 1970-01-01
  • 2019-07-05
  • 2011-08-17
  • 2013-06-04
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2011-06-07
  • 2011-02-19
相关资源
最近更新 更多