Расширитель WPF IsExpanded binding

У меня есть элемент управления 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>

Ответы

Ответ 1

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

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

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

и

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

Ответ 2

Меня поймало, что 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>

Ответ 3

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

Связывание не теряется, когда вы вручную расширяете/сворачиваете один расширитель...

Ответ 4

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

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

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

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

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