Расширитель 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.
Я знаю, что была проблема с переключателями, что они потеряли бы привязки, когда была установлена другая кнопка в группе, я не думаю, что это проблема, но конвертер отладки поможет вам понять это.