2010-02-01 12 views
13

Mam kontrolkę Expander z jego właściwością IsExpanded powiązaną z boolem w modelu mvvm. Wiązanie działa dobrze, dopóki nie dotkniesz ekspandera. Po kliknięciu strzałki w ekspanderze w celu rozwinięcia wiązanie przestaje działać. Ustawienie bool ShowPreview na false w modelu nie zwija ekspandera.Expander WPF IsExpanded binding

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

Czy twój obiekt z właściwością ShowPreview implementuje interfejs INotifyPropertyChanged i podnosi wydarzenie po zmianie właściwości? – mattythomas2000

+1

Tryb wiązania powinien być TwoWay. Po rozwinięciu ekspandera wiązanie OneWay ulega zwinięciu, a rozszerzenie jest sterowane ramowo. – apandit

+0

Dzięki! TwoWay działa. Ale dlaczego nie może działać w ten sposób? Interesuje mnie tylko model kontrolujący ekspansję i zwijanie oparty na zdarzeniu zewnętrznym, które ustawia go na wartość true lub false. Jeśli struktura rozszerza lub zwija ekspander, nie jestem zainteresowany, aby ta wartość została cofnięta w modelu. – netraju

Odpowiedz

7

Czy usunąć Mode=OneWay czy to rozwiązuje problem?

Po przeczytaniu innych NWZ (zmiany w GUI nie wpływają na model), nie mam dobrej sugestii, jak ograniczyć zmiany widoczne dla danych podstawowych. Jaka jest różnica w:

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

I

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

Tak Tryb usuwania = Oneway działa. – netraju

0

zrobić trzy rzeczy,

upewnić się, że ViewModel wdraża INotifyPropertyChanged. Twój ui przyzwyczajenie wiedzieć o zmianie, jeśli widok modelu robi poinformować go, gdy właściwość zmienia

zmienić tryb na TwoWay, chcesz, aby Twój widok modelu aktualizowany, gdy zmienia ekspandera i chcesz, aby ekspander aktualizowane kiedy model widok zmienia

Na koniec, jeśli powyższe dwa nie działają, użyj konwertera debugowania, aby sprawdzić, czy powiązanie nie działa. istnieje przykład: here, jak to zrobić. Jest to technika potrzebna każdemu deweloperowi wpf.

Wiem, że był problem z przyciskami radiowymi, że utracili swoje powiązania, gdy został ustawiony inny przycisk w grupie, nie sądzę, że jest to problem, jednak konwerter debugowania pomoże ci to obliczyć.

+0

Dzięki za odpowiedzi. Tak, model implementuje INotifyPropertyChanged. Wiązanie działa dobrze, o ile nie dotykasz ekspandera. Po kliknięciu myszą na ekspanderze, aby rozwinąć, wiązanie już nie działa. Podczas debugowania widać, że IsExpanded otrzymuje wartość true lub false. Ale wizualnie ekspander pozostaje rozszerzony. – netraju

+0

jeśli włączysz konwerter debugowania, czy konwerter debugowania będzie ciągle trafiony za każdym razem, gdy zmienisz stan zwinięty? –

5

Co złowione mnie jest to, że IsExpanded jest OneWay domyślnie, więc

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

nie działa tak, jak oczekiwano. Tylko jeśli dodać Mode=TwoWay, to działa (czyli pozycja zaczyna zwracać uwagę na moje Expanded własności i jej uaktualnianie), podobnie jak w

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

z Silverlight zrobić to:

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

Wiązanie nie jest tracone, gdy ręcznie rozwijasz/zwijasz jednego Expander ...

+0

Jedyne co musiałem zmienić dla wpf było w opcji propertychangedtrigger i value, Binding Path = ShowPreview. Poza tym, to było dla mnie idealne, dziękuję. –

Powiązane problemy