WPF Expander IsExpanded переплет - PullRequest
       7

WPF Expander IsExpanded переплет

14 голосов
/ 01 февраля 2010

У меня есть элемент управления Expander со свойством IsExpanded, связанным с bool в модели mvvm. Привязка работает нормально, пока вы не коснетесь расширителя. Как только вы щелкнете стрелку в расширителе, чтобы развернуться, привязка перестает работать. Установка в модели bool ShowPreview значения false не приводит к разрушению расширителя.

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

Ответы [ 4 ]

7 голосов
/ 02 февраля 2010

Если вы удалите Mode=OneWay, это решит проблему?

После прочтения вашего другого CTQ (изменения в графическом интерфейсе не влияют на модель) у меня нет хорошего предложения о том, как ограничить изменение, видимое базовыми данными. В чем разница:

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

И

myModel.MyProperty = true; // done by a binding
5 голосов
/ 21 мая 2010

Меня поразило то, что IsExpanded по умолчанию OneWay, поэтому

<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 голос
/ 30 мая 2012

С помощью 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 голосов
/ 02 февраля 2010

Сделай три вещи,

Убедитесь, что ваш ViewModel реализует INotifyPropertyChanged. Ваш пользовательский интерфейс не будет знать об изменении, если ваша модель представления не сообщит об этом при изменении свойства

Измените режим на TwoWay, вы хотите, чтобы ваша модель вида обновлялась при изменении экспандера, и вы хотите, чтобы ваш расширитель обновлялся при изменении модели вида

Наконец, если вышеперечисленные два не работают, используйте отладочный конвертер, чтобы убедиться, что ваша привязка не работает. Вот пример здесь того, как это сделать. Это метод, который нужен каждому разработчику wpf.

Я знаю, что была проблема с переключателями, что они теряли свои привязки, когда была установлена ​​другая кнопка в группе, я не думаю, что это проблема здесь, однако конвертер отладки поможет вам понять это. 1014 *

...