2013-08-26 45 views
5

我看到很多关于如何将布尔值绑定到单选按钮的文章。但我的情况是我需要将它绑定到一个单选按钮并从用户那里读取选择内容。将Xaml单选按钮绑定到布尔值

这是没有选择应该选择intially。

如果我将它绑定到一个布尔值,因为boolean cant为null,它将显示在单选按钮中选择的默认值。

如果我使用可空布尔值,当尝试使用转换器时,我仍默认为false。

我不能在xaml中使用单向模式,因为我需要检查单选按钮的选择是否使用了有界变量。

Ant指针如何实现这个?

+0

如果它是一个布尔值,为什么你想要绑定到一个单选按钮?复选框不会更好吗? – ChrisF

+0

我认为复选框,但它不会给我相同的问题? selectedvalue绑定到一个布尔值并使用转换器将有相同的问题? –

+0

否。当布尔值为false时,复选框为空。如果它为真,则检查它。您也可以将它绑定到一个可空布尔值,并将其作为复选框的第三个不确定状态。你想在这里做什么?这个布尔值代表什么? – ChrisF

回答

5

您可以将一个可为null的布尔值绑定到您的单选按钮,但您需要通过转换器来完成此操作。

首先声明的变量:

private bool? answer; 
public bool? Answer 
{ 
    get { return answer; } 
    set 
    { 
     answer = value; 
     if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Answer")); 
    } 
} 

,并初始化到null

然后在XAML:

<Window.Resources> 
    <local:BooleanConverter x:Key="BooleanConverter"/> 
</Window.Resources> 

<StackPanel Grid.Row="1"> 
    <RadioButton Content="I Agree" 
       IsChecked="{Binding Answer, 
          Converter={StaticResource BooleanConverter}, 
          ConverterParameter='true', Mode=TwoWay}" /> 
    <RadioButton Content="I Disagree" 
       IsChecked="{Binding Answer, 
          Converter={StaticResource BooleanConverter}, 
          ConverterParameter='false', Mode=TwoWay}" /> 
</StackPanel> 

最后你的转换器:

class BooleanConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var test = (bool?)value; 
     var result = bool.Parse((string)parameter); 

     if (test == result) 
     { 
      return true; 
     } 

     return false; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var result = bool.Parse((string)parameter); 
     return result; 
    } 
} 

此结合的单选按钮Answer并指出当值true第一个将只能托运当答案是false时,第二个将被检查。然后,您可以在让用户继续前检查Answer是否为空。

+0

谢谢...我使用完全相同的东西,但由于某些原因,我的视图加载之前,布尔变得设置为false。我认为这是因为转换器。生病检查发生了什么,并返回 –

+1

@ashishg - 确保您在构造函数中显式设置可空布尔值为null。 – ChrisF

+0

这工作..问题是,我使用相同的变量名称与其他人定义的某处,但在这里可用,每次视图加载它得到更新。 –

0

这可能不是最好的办法,但你可以使用类似于这样的东西: checkbox like radiobutton wpf c# 只是有两个控件。

我感谢这不是最好的,但阅读你的答案,它给你你想要的(一般)。

+0

我想过在检查/取消选中时触发事件,但这样做,但是认为它不会是一个很好的解决方案,并将其发布到此处,以查看是否有更好的方法来做到这一点 –