2010-02-01 255 views
13

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

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

你的对象与属性ShowPreview实现INotifyPropertyChanged接口,并提高事件时,你的财产被更改? – mattythomas2000 2010-02-01 22:31:28

+1

绑定模式应该是双向的。只要展开扩展器,OneWay绑定就会崩溃,并且扩展受框架控制。 – apandit 2010-02-02 02:12:20

+0

谢谢!双向工程。但为什么它不能单向工作呢?我只对基于外部事件控制扩展和崩溃的模型感兴趣,该外部事件将其设置为true或false。如果框架扩展或崩溃扩展器,那么我不会对该模型中设置的值产生兴趣。 – netraju 2010-02-02 19:23:31

回答

7

如果您删除Mode=OneWay是否解决了问题?

在阅读您的其他CTQ(对GUI的更改不会影响模型)时,我对如何限制底层数据看到的更改没有很好的建议。是什么在差异:

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

而且

myModel.MyProperty = true; // done by a binding 
+0

是删除模式=单向工作。 – netraju 2010-02-02 19:23:51

0

做三件事情,

确保您ViewModel正在实施INotifyPropertyChanged。您的UI不会知道这个变化,如果当地产改变

模式改变为TwoWay您的视图模型犯规通知它,你要当你希望在视图模型改变

您的扩展更新扩展改变你的视图模型更新

最后,如果上述两个不起作用,使用调试转换器来确定您的绑定是否失败。有一个例子here如何做到这一点。这是每个wpf开发者都需要的技术。

我知道单选按钮存在一个问题,当组中的另一个按钮被设置时,他们会失去绑定,我认为这不是问题,但是调试转换器会帮助您解决这个问题。

+0

感谢您的回复。是的,模型确实实现了INotifyPropertyChanged。只要你不触摸膨胀机,该绑定就可以正常工作。只要鼠标点击扩展器展开,绑定就不再起作用。在调试中,您可以看到IsExpanded正在设置为true或false。但视觉上扩展器保持扩展。 – netraju 2010-02-02 16:43:45

+0

如果将调试转换器打开,每次更改折叠状态时,调试转换器是否都会一直点击? – 2010-02-02 22:29:23

5

什么抓住了我在这里的是,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> 
1

使用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> 
//... 

结合不会丢失,当你手动扩展/折叠一个扩展器...

+0

我必须改变wpf的唯一方法是在属性changedtrigger和值选项Binding Path = ShowPreview。除此之外,这对我来说非常完美,谢谢。 – 2014-04-29 22:27:36