radiobuttons MVVM

votos
38

Alguém por favor me ajude. Eu tenho um problema interessante. Eu estou tentando implementar um aplicativo MVVM e eu quero vincular a radiobuttons em minha opinião.

Aqui é o meu ponto de vista:

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

Aqui está a minha 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);
        }
    }

O problema é este, quando eu clico as diferentes radiobuttons a propriedade setter só é chamado pela primeira vez (quando eu corro através de depuração). eg Quando clico NoteGeneral, LegalContacte, então NoteGeneral novamente apenas os dois primeiros cliques atualizar meu viewmodel. Eu acho que pode ter algo errado com a minha ligação, ou talvez eu estou abordando este o caminho completamente errado.

Alguém pode ajudar?

Como devo implementar radiobutton seleções na minha viewmodel?

.NET 4 e posterior

Este problema com RadioButton ligação foi resolvido pela Microsoft quando o .NET 4 foi lançado. A ligação do RadioButtons agora trabalha como seria de esperar sem nenhuma das soluções alternativas listadas abaixo.

Publicado 19/05/2009 em 15:49
fonte usuário
Em outras línguas...                            


4 respostas

votos
18

Dê uma olhada aqui .

Eu não implementaram a solução fornecida, mas faz sentido. O controle de estrutura subjacente quebra você ligações quando um clique é executada. A solução é substituir o método que faz isso e confiar apenas nas ligações.

Respondeu 19/05/2009 em 16:07
fonte usuário

votos
15

Jaime Rodriguez , que trabalha na Microsoft em WPF, publica um Q & A integral em WPF, e a última edição tem um post sobre RadioButtons e MVVM!

O post é a http://blogs.msdn.com/jaimer/archive/2009/09/22/wpf-discussion-090922.aspx , e você quer olhar para o último item nesse post. Eu testei a solução e ele funciona para a minha satisfação.

Citado por conveniência:

Eu trabalhei em torno deste problema no .NET 3.5 SP1. Veja como dados I se ligam a um grupo de botões de rádio para uma propriedade com valor de enumeração:

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

Definir GroupName de cada botão de opção para um valor exclusivo impede que as ligações fiquem derrotado quando o usuário clica em um botão de rádio. Aqui eu estou contando com a fonte de dados para implementar INotifyPropertyChanged, que dirá os outros botões de rádio para atualizar. Uma abordagem semelhante deve trabalhar para botões de rádio em um ItemsControl.

Respondeu 01/10/2009 em 23:00
fonte usuário

votos
8

Eu escrevi uma dica simples para este problema no meu blog.

Neste caso, você deve escrever a vista eo ViewModel como o seguinte:

<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; }
    }
...
Respondeu 26/09/2009 em 08:02
fonte usuário

votos
0

você tem que definir UpdateSourceTrigger = "PropertyChanged" na ligação XAML como

 <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>
Respondeu 19/05/2016 em 06:23
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more