在 WPF 中使用具有多个值的 DataTrigger

Posted

技术标签:

【中文标题】在 WPF 中使用具有多个值的 DataTrigger【英文标题】:Using DataTrigger with more than one values in WPF 【发布时间】: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个不同的值?? 【参考方案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,我想要它。我该怎么做?

以上是关于在 WPF 中使用具有多个值的 DataTrigger的主要内容,如果未能解决你的问题,请参考以下文章

具有空值的 WPF ComboBox SelectedValue 绑定显示为空白

具有多个视图的 WPF 桌面应用程序

WPF - 使用具有多个 ViewModel 的单个模型

如何使用 Flutter 在 Firestore 中删除具有特定值的多个文档

具有多个图像的 WPF DataGrid RowDetailsTemplate (MVVM)

具有多列值的 DataView 的 RowFilter