我的绑定转换有什么问题?

时间:2011-06-15 13:23:56

标签: wpf silverlight

我有radiobutton,我想在radiobutton.IsChecked状态和一些stackpanel的可见性之间定义绑定,所以我写了这个转换方法:

 public class RadioBtnState2Visible : IValueConverter
{
    public object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
    {
        return ( bool )value == true ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
    {
        return ( Visibility )value == Visibility.Visible ? true : false;
    }
}

我制作了绑定 - xaml:

 <local:PageEx.Resources>
       <local:RadioBtnState2Visible x:Key="Convert" />
 </local:PageEx.Resources>


 <RadioButton x:Name="MyRadioBtn1" GroupName="group1" />
 <RadioButton x:Name="MyRadioBtn2" GroupName="group1" />

  <StackPanel Visibility="{Binding ElementName=MyRadioBtn1, Path=IsChecked, Converter={StaticResource Convert}}" />

但没有任何作用!

stackpanel的可见性状态始终可见!

我做错了什么?

3 个答案:

答案 0 :(得分:3)

让您的代码处理一个小的更改。我使转换器成为页面资源:

<UserControl.Resources>
    <local:RadioBtnState2Visible x:Key="Convert" />
</UserControl.Resources>

我还应该提一下,我必须在stackpanel中实际放置一些内容以查看更改,因为默认情况下它会折叠为任何内容:)我假设您实际上在实际的堆栈面板中有内容。


只是为了解释这里发生的事情。通过向资源声明添加“local:”,您实际上是封闭了Resource的一个实例,而不是更改当前资源。通过“转换”引用它不起作用,因为它无法找到它希望找到它的资源。

答案 1 :(得分:1)

这是Silverlight还是WPF?您可能需要为绑定指定模式。 Mode = OneWay应该可以工作。

答案 2 :(得分:0)

事实上,RadioButton.IsChecked不是bool而是Nullable<bool> 1

所以,你的代码应该是:

 public class RadioBtnState2Visible : IValueConverter
{
    public object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
    {
        return   (value == true) ? Visibility.Visible : Visibility.Collapsed; // the explicit check to true is needed because of  case value=null
    }

    public object ConvertBack( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
    {
        return value == Visibility.Visible ; // yup, it's a boolean
    }
}

它应该更好。