2010-02-01 249 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