MVVM радиокнопки - PullRequest
       41

MVVM радиокнопки

39 голосов
/ 19 мая 2009

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

Ответы [ 4 ]

19 голосов
/ 19 мая 2009

Взгляните здесь .

Я не реализовал предоставленное решение, но оно имеет смысл. Базовый элемент управления разрушает привязки при выполнении щелчка. Решение состоит в том, чтобы переопределить метод, который делает это, и просто полагаться на привязки.

15 голосов
/ 02 октября 2009

Хайме Родригес , который работает в Microsoft над WPF, публикует неограниченные вопросы и ответы по WPF, а в последнем выпуске есть пост на RadioButtons и MVVM!

Пост находится в http://blogs.msdn.com/jaimer/archive/2009/09/22/wpf-discussion-090922.aspx,, и вы хотите посмотреть последний элемент в этом посте. Я проверил решение, и оно работает к моему удовлетворению.

Приведено для удобства:

Я работал над этой проблемой в .NET 3.5 SP1. Вот как данные связывают группу переключателей с перечисляемым свойством:

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

8 голосов
/ 26 сентября 2009

Я написал простой совет для этой проблемы в моем блоге.

В этом случае вы должны написать 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; }
    }
...
0 голосов
/ 19 мая 2016

Вы должны установить 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>
...