Радиаторы MVVM
Кто-то, пожалуйста, помогите. У меня интересная проблема. Я пытаюсь реализовать приложение MVVM, и я хочу привязать его к радиобарабанам.
Здесь мой взгляд:
<StackPanel Orientation="Horizontal" Grid.ColumnSpan="2" >
<RadioButton GroupName="1" IsChecked="{Binding Path=NoteGeneral, Mode=TwoWay}">General</RadioButton>
<RadioButton GroupName="1" IsChecked="{Binding Path=NoteContact, Mode=TwoWay}" >Contact</RadioButton>
<RadioButton GroupName="1" IsChecked="{Binding Path=NoteAddress, Mode=TwoWay}" >Address</RadioButton>
<RadioButton GroupName="1" IsChecked="{Binding Path=NotePhone, Mode=TwoWay}" >Phone</RadioButton>
</StackPanel>
Здесь моя ViewModel:
bool _NoteGeneral;
public bool NoteGeneral
{
get { return _NoteGeneral; }
set
{
_NoteGeneral = value;
OnPropertyChanged("NoteGeneral");
}
}
bool _NoteContact;
public bool NoteContact
{
get { return _NoteContact; }
set
{
_NoteContact = value;
OnPropertyChanged("NoteContact");
}
}
bool _NoteAddress;
public bool NoteAddress
{
get { return _NoteAddress; }
set
{
_NoteAddress = value;
OnPropertyChanged("NoteAddress");
}
}
bool _NotePhone;
public bool NotePhone
{
get { return _NotePhone; }
set
{
_NotePhone = value;
OnPropertyChanged("NotePhone");
}
}
Проблема в том, что, когда я нажимаю на различные радиокнопки, средство настройки свойств вызывается только в первый раз (когда я запускаю отладку). например Когда я нажимаю NoteGeneral, NoteContact, то NoteGeneral снова только первые два клика обновляют мою модель просмотра. Я думаю, что у меня может быть что-то не так с моей привязкой, или, может быть, я подхожу к этому совершенно неправильно.
Может ли кто-нибудь помочь?
Как мне выполнить выбор радиобутов в моей модели просмотра?
.NET 4 и более поздние версии
Эта проблема с привязкой RadioButton была разрешена Microsoft при выпуске .NET 4. Связывание RadioButtons теперь работает так, как вы ожидали бы, без каких-либо обходов, перечисленных ниже.
Ответы
Ответ 1
Посмотрите здесь.
Я не реализовал предоставленное решение, но это имеет смысл. Основной элемент управления базой данных разбивает привязки при нажатии. Решение состоит в том, чтобы переопределить метод, который делает это, и просто полагаться на привязки.
Ответ 2
Хайме Родригес, который работает в Microsoft на WPF, публикует неограниченный Q & A на WPF, а последняя проблема имеет сообщение на RadioButtons и MVVM!
Сообщение находится в http://blogs.msdn.com/jaimer/archive/2009/09/22/wpf-discussion-090922.aspx, и вы хотите посмотреть последний элемент в этом сообщении. Я протестировал решение, и оно работает для моего удовлетворения.
Цитата для удобства:
Я работал над этой проблемой в .NET 3.5 SP1. Здесь, как я данные связывают группу переключателей с enum-valued свойством:
<StackPanel>
<RadioButton Content="New folder"
IsChecked="{Binding Path=PublishTarget,
Converter={StaticResource equalityConverter},
ConverterParameter={x:Static local:PublishTarget.NewServerFolder}, Mode=TwoWay}"
GroupName="1" />
<RadioButton Content="Existing folder"
IsChecked="{Binding Path=PublishTarget,
Converter={StaticResource equalityConverter},
ConverterParameter={x:Static local:PublishTarget.ExistingServerFolder},
Mode=TwoWay}"
GroupName="2" />
<RadioButton Content="Local folder"
IsChecked="{Binding Path=PublishTarget,
Converter={StaticResource equalityConverter},
ConverterParameter={x:Static local:PublishTarget.LocalFolder},
Mode=TwoWay}"
GroupName="3" />
</StackPanel>
Настройка каждого переключателя GroupName на уникальное значение запрещает привязку привязок при нажатии на переключатель. Здесь я полагаюсь на источник данных для реализации INotifyPropertyChanged, который будет сообщать другим переключателям для обновления. Аналогичный подход должен работать для переключателей в ItemsControl.
Ответ 3
Я написал простой совет для этой проблемы в своем блоге.
В этом случае вы должны написать View и ViewModel следующим образом:
<StackPanel Orientation="Horizontal" Grid.ColumnSpan="2">
<RadioButton IsChecked="{Binding IsGeneralNote}">General</RadioButton>
<RadioButton IsChecked="{Binding IsContactNote}">Contact</RadioButton>
<RadioButton IsChecked="{Binding IsAddressNote}">Address</RadioButton>
<RadioButton IsChecked="{Binding IsPhoneNote}">Phone</RadioButton>
</StackPanel>
public enum Note
{
General,
Contact,
Address,
Phone,
}
...
Note note = Note.General;
public Note Note
{
get { return this.note; }
set
{
if (this.note == value)
return;
this.note = value;
OnPropertyChanged("Note");
OnPropertyChanged("IsGeneralNote");
OnPropertyChanged("IsContactNote");
OnPropertyChanged("IsAddressNote");
OnPropertyChanged("IsPhoneNote");
}
}
public bool IsGeneralNote
{
get { return Note == Note.General; }
set { Note = value ? Note.General : Note; }
}
public bool IsContactNote
{
get { return Note == Note.Contact; }
set { Note = value ? Note.Contact : Note; }
}
public bool IsAddressNote
{
get { return Note == Note.Address; }
set { Note = value ? Note.Address : Note; }
}
public bool IsPhoneNote
{
get { return Note == Note.Phone; }
set { Note = value ? Note.Phone : Note; }
}
...
Ответ 4
Вы должны установить UpdateSourceTrigger="PropertyChanged"
в привязке XAML, например:
<StackPanel Grid.Column="1" Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center">
<RadioButton Name="rdbTimeFormat12" GroupName="TimeFormat" Content="12 Hrs" IsChecked="{Binding Radio1IsCheck,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<RadioButton Name="rdbTimeFormat24" GroupName="TimeFormat" Margin="40,0,0,0" Content="24 Hrs" IsChecked="{Binding Radio2IsCheck,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>