我有一个带有扩展器的WPF应用程序,我希望IsExpanded属性根据我的视图模型中的枚举值进行更改,即我希望扩展器基于此枚举属性打开或关闭。我在xaml中使用数据触发器来根据我的枚举后备属性的值更新IsExpanded属性。
<Expander Header="Information and Procedures"
BorderThickness="0"
Margin="5">
<Expander.Style>
<Style TargetType="{x:Type Expander}" BasedOn="{StaticResource MetroExpander}">
<Style.Triggers>
<DataTrigger Binding="{Binding DataContext.Item.Match, RelativeSource={RelativeSource AncestorType={x:Type UserControl}, Mode=FindAncestor}, Mode=TwoWay}"
Value="{x:Static enum:Match.Multiple}">
<Setter Property="IsExpanded" Value="False"/>
</DataTrigger>
<DataTrigger Binding="{Binding DataContext.Item.Match, RelativeSource={RelativeSource AncestorType={x:Type UserControl}, Mode=FindAncestor}, Mode=TwoWay}"
Value="{x:Static enum:Match.None}">
<Setter Property="IsExpanded" Value="True"/>
</DataTrigger>
<DataTrigger Binding="{Binding DataContext.Item.Match, RelativeSource={RelativeSource AncestorType={x:Type UserControl}, Mode=FindAncestor}, Mode=TwoWay}"
Value="{x:Static enum:Match.Exact}">
<Setter Property="IsExpanded" Value="True"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Expander.Style>
<WrapPanel Orientation="Horizontal" Background="Transparent">
<view:InformationView Margin="0 0 20 0"/>
<view:ProceduresView Margin="0 0 0 0" />
</WrapPanel>
</Expander>
这似乎有效,直到我们手动扩展扩展器。在此之后,似乎现在忽略了数据触发器,并且手动设置的IsExpanded属性将不会更改,直到用户再次手动打开或关闭扩展器。
我希望用户能够手动展开或关闭它,但我希望数据触发器优先于用户输入。
注意:我不希望IsExpanded属性更改Match的值。匹配会单独更新,但其值会影响IsExpanded
这是因为绑定是在DataTrigger
而不是IsExpanded
属性,所以改变IsExpanded
没有影响没有DataTrigger
绑定属性。
绑定到IsExpanded
属性并使用自定义IValueConverter
在源枚举和扩展器bool之间进行双向转换。
见:https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.data.ivalueconverter
作为一个很好的副作用,你最终会得到更短,更容易阅读的XAML。
UPDATE
要实现所需的行为,请在viewmodel上为展开状态设置一个布尔属性,该属性绑定到IsExpanded
的Expander
属性的双向,并在Match
属性更改时在viewmodel中更改它。这样,用户和viewmodel都可以修改Expander
的状态。
就像是:
public bool IsExpanded
{
get => _isExpanded;
set
{
_isExpanded = value;
OnPropertyChanged(nameof(IsExpanded));
}
}
public Match Match
{
get => _match;
set
{
_match = value;
switch (value)
{
case Exact:
case None:
IsExpanded = true;
break;
case Multiple:
IsExpanded = false;
break;
}
}
}