Конвенция в Caliburn.Micro для переключателей

Я нахожу работу с радиообъектами в WPF/MVVM как слегка раздражающий опыт. Ответ "Go-to" для устранения раздражений в WPF ищет решение в Caliburn.Micro или один из рецептов или примеров реализации, таких как CoProject. Но я не могу найти никакой реализации конвенции для радиообмена. И, пытаясь сделать свой собственный, я понимаю, как трудно заставить это чувствовать себя естественным и интуитивным.

Кто-нибудь знает о хорошей реализации этого соглашения?

Ответ 1

Я думаю, что так, это польза для вас: -

<UserControl x:Class="CaliburnMicroTest.Views.RadioButtonTestView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         d:DesignHeight="300"
         d:DesignWidth="300"
         mc:Ignorable="d">
<StackPanel>
    <RadioButton Name="NewInstallChecked"
                 Margin="75,10,0,0"
                 Content="New Installation (default)"
                 GroupName="InstallType" />
    <RadioButton Name="UpdateInstallChecked"
                 Margin="75,10,0,0"
                 Content="Update of existing Installation"
                 GroupName="InstallType" />
    <Label Name="label2"
           Height="28"
           Margin="20,20,0,0"
           HorizontalAlignment="Left"
           VerticalAlignment="Top"
           Content="Please select which version of Siseco you want to install:" />
    <RadioButton Name="ServerChecked"
                 Margin="75,10,0,0"
                 Content="Server version (default)"
                 GroupName="Version" />
    <RadioButton Name="ClientChecked"
                 Margin="75,10,0,0"
                 Content="Client version"
                 GroupName="Version" />
    <StackPanel Margin="10" Orientation="Horizontal">
        <Button Name="SaveAndClose"
                Width="80"
                Content="Ok" />
        <Button Name="TryClose"
                Width="80"
                Content="Cancel" />
    </StackPanel>
</StackPanel></UserControl>




 public class RadioButtonTestViewModel : Screen
{
    private bool newInstallChecked;
    private bool updateInstallChecked;
    private bool serverChecked;
    private bool clientChecked;

    public bool NewInstallChecked
    {
        get { return newInstallChecked; }
        set
        {
            if (value.Equals(newInstallChecked)) return;
            newInstallChecked = value;
            NotifyOfPropertyChange(() => NewInstallChecked);
        }
    }

    public bool UpdateInstallChecked
    {
        get { return updateInstallChecked; }
        set
        {
            if (value.Equals(updateInstallChecked)) return;
            updateInstallChecked = value;
            NotifyOfPropertyChange(() => UpdateInstallChecked);
        }
    }

    public bool ServerChecked
    {
        get { return serverChecked; }
        set
        {
            if (value.Equals(serverChecked)) return;
            serverChecked = value;
            NotifyOfPropertyChange(() => ServerChecked);
        }
    }

    public bool ClientChecked
    {
        get { return clientChecked; }
        set
        {
            if (value.Equals(clientChecked)) return;
            clientChecked = value;
            NotifyOfPropertyChange(() => ClientChecked);
        }
    }

    public void SaveAndClose()
    {
        Options.Client = ClientChecked;
        Options.NewInstall = NewInstallChecked;

        Options.Server = ServerChecked;
        Options.UpdateInstall = UpdateInstallChecked;

        TryClose();
    }

    protected override void OnInitialize()
    {
        base.OnInitialize();

        ClientChecked = Options.Client;
        NewInstallChecked = Options.NewInstall;

        ServerChecked = Options.Server;
        UpdateInstallChecked = Options.UpdateInstall;
    }

    public static class Options
    {
        public static bool NewInstall { get; set; }
        public static bool UpdateInstall { get; set; }

        public static bool Server { get; set; }
        public static bool Client { get; set; }
    }}