WPF Expander在用户交互后忽略数据绑定

问题描述 投票:2回答:1

我有一个带有扩展器的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

c# wpf xaml
1个回答
2
投票

这是因为绑定是在DataTrigger而不是IsExpanded属性,所以改变IsExpanded没有影响没有DataTrigger绑定属性。

绑定到IsExpanded属性并使用自定义IValueConverter在源枚举和扩展器bool之间进行双向转换。

见:https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.data.ivalueconverter

作为一个很好的副作用,你最终会得到更短,更容易阅读的XAML。

UPDATE

要实现所需的行为,请在viewmodel上为展开状态设置一个布尔属性,该属性绑定到IsExpandedExpander属性的双向,并在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;
       }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.