WPF扩展器忽略了用户交互后的数据绑定

时间:2018-08-30 13:58:25

标签: c# wpf xaml

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

2 个答案:

答案 0 :(得分:2)

这是因为绑定位于selectionChange(option: MatListOption) { console.log(option.selected); } 而不是DataTrigger属性上,因此更改IsExpanded不会影响IsExpanded绑定属性。

绑定到DataTrigger属性,并使用自定义IsExpanded在源枚举和扩展器布尔之间双向转换。

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

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

更新

要获得所需的行为,请在视图模型上为展开状态设置一个布尔属性,该属性与IValueConverter的{​​{1}}属性绑定2种方式,并在更改后的视图模型中对其进行更改IsExpanded属性更改。这样,用户和视图模型都可以修改Expander的状态。

类似的东西:

Match

答案 1 :(得分:0)

视图模型不应依赖于视图。也就是说,您不应按照Scroog的答案所建议的那样添加IsExpanded属性。

我通过一个Behavior类解决了一个非常类似的问题,该类根据Expander的IsEnabled属性更改IsExpanded。因此,这仅在视图中实现。 下面的类只是一个示例,可以通过添加一个依赖属性来增强该属性,该依赖属性绑定到将使用的视图模型的任何属性,而不是检查IsEnabled。

sql:"default:now()"

并在XAML中用作

"chat_admins" ("id" bigserial, "tg_id" bigint, "created_at" timestamptz NOT NULL DEFAULT now(), PRIMARY KEY ("id"))