2011-11-16 54 views
11

我發現在WPF/MVVM中使用單選按鈕會帶來一些煩人的體驗。 去除WPF中的煩惱的「前往」答案是在Caliburn.Micro或其中一個配方或示例實現(如CoProject)中尋找解決方案。但我無法找到對於單選按鈕的約定的任何實現。並試圖讓我自己,我意識到有多難讓這感覺自然和直觀。在Caliburn.Micro中的單選按鈕公約

有沒有人知道這個約定的良好實施?

回答

0

我是這麼認爲的,這是使用全給你: -

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