WPF Expander IsExpanded绑定

093gszye  于 2023-03-24  发布在  其他
关注(0)|答案(5)|浏览(275)

我有一个Expander控件,它的IsExpanded属性绑定到mvvm模型中的bool。绑定工作正常,直到你不接触扩展器。一旦你点击扩展器中的箭头来扩展,绑定停止工作。在模型中将bool ShowPreview设置为false不会折叠扩展器。

<Expander Name="pExpander" 
          IsExpanded="{Binding Path=ShowPreview,Mode=OneWay}"
          Header="Preview">
    <TextBlock Text="{Binding Path=Message, Mode=OneWay}"></TextBlock>    
</Expander>
wb1gzix0

wb1gzix01#

如果删除Mode=OneWay,是否可以解决问题?
在阅读了您的其他CTQ(对GUI的更改不影响模型)之后,我没有一个好的建议来限制底层数据所看到的更改。

myModel.MyProperty = true; // in *your* code behind

还有

myModel.MyProperty = true; // done by a binding
8ulbf1ek

8ulbf1ek2#

这里让我困惑的是,默认情况下,IsExpandedOneWay,所以

<Style TargetType="TreeViewItem">
    <Setter Property="IsExpanded" Value="{Binding Expanded}"/>
</Style>

只有当你添加了Mode=TwoWay,它才能工作(也就是说,项目开始关注我的Expanded属性,并更新它),如

<Style TargetType="TreeViewItem">
    <Setter Property="IsExpanded" Value="{Binding Expanded, Mode=TwoWay}"/>
</Style>
gjmwrych

gjmwrych3#

在Silverlight中,我这样做:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"

<Expander Name="pExpander" IsExpanded="True" Header="Preview">
    <i:Interaction.Triggers>
        <ei:PropertyChangedTrigger Binding="{Binding ShowPreview, Mode=OneWay}">
            <ei:ChangePropertyAction PropertyName="IsExpanded" Value="{Binding ShowPreview, Mode=OneWay}"/>
        </ei:PropertyChangedTrigger>
    </i:Interaction.Triggers>
    <TextBlock Text="{Binding Path=Message, Mode=OneWay}"></TextBlock>    
</Expander>
<Expander Name="pExpander1" IsExpanded="True" Header="Preview 1">
    <i:Interaction.Triggers>
        <ei:PropertyChangedTrigger Binding="{Binding ShowPreview, Mode=OneWay}">
            <ei:ChangePropertyAction PropertyName="IsExpanded" Value="{Binding ShowPreview, Mode=OneWay}"/>
        </ei:PropertyChangedTrigger>
    </i:Interaction.Triggers>
    <TextBlock Text="{Binding Path=Message1, Mode=OneWay}"></TextBlock>    
</Expander>
//...

当您手动展开/折叠一个Expander时,绑定不会丢失...

30byixjq

30byixjq4#

做三件事
确保您的ViewModel实现了INotifyPropertyChanged。如果视图模型在属性更改时没有通知它,那么您的ui将不会知道更改
将Mode更改为TwoWay,您希望在扩展器更改时更新视图模型,并且希望在视图模型更改时更新扩展器
最后,如果上面两个都不起作用,使用调试转换器来确定你的绑定是否失败。有一个例子here如何做到这一点。这是每个wpf开发人员都需要的技术。
我知道单选按钮有一个问题,当组中的另一个按钮被设置时,它们会失去绑定,我不认为这是这里的问题,但是调试转换器将帮助您解决这个问题。

hjqgdpho

hjqgdpho5#

在我的例子中(.NET Framework 4),扩展的setter没有被调用,因为它的绑定需要UpdateSourceTrigger=PropertyChanged,而设置Mode=TwoWay(如other answer中所建议的)不能解决这个问题。
最后我使用了以下XAML:

<Expander x:Name="GroupExpander"
          IsExpanded="{Binding IsExpanded, UpdateSourceTrigger=PropertyChanged}"/>

我的Expander在一个DataGridTemplateColumn中(在一行中)。

相关问题