我有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的可见性状态始终可见!
我做错了什么?
答案 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
}
}
它应该更好。