在WPF中使用DataTrigger处理多个值

6

I am using XAML code part of which is

<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>

现在我想使用一个数据触发器,它的值可以是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>

你想通过数据触发器实现什么? - Akanksha Gaur
@user1341006,你的属性Name怎么可能同时有5个不同的值呢? - Ankesh
2个回答

10

MultiDataTrigger适用于全部满足条件而不是任何,这就是为什么你的MultiDataTrigger无法工作的原因。

要么使用四个单独的触发器,或者将条件放入一个单独的布尔属性中,例如:

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

当"Value"改变时,为"ShowAssessment"引发属性更改通知。

例如:

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

然后在ShowAssessment上触发。

可能更好的解决方案是添加一个HeaderText属性,并使用switch语句返回基于Value的正确标题文本。然后将头部文本绑定到该属性即可,无需触发器。


我希望当任何一个值满足时,触发器生效。我希望只使用一个触发器,而不是四个触发器。 - Jainendra
我的答案中有几个解决方案。一个触发器适用于您的四个值,或者通过将逻辑移入视图模型来避免使用触发器。 - Phil

0

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的实现。使用它来提供更改通知。


1
如果值为3、301、302或303,我希望这样做。我应该怎么做? - Jainendra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接