问题描述
|
我有单选按钮,我想定义单选按钮.isChecked状态和某些堆栈面板的可见性之间的绑定,所以我写了这个convert方法:
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,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}}\" />
但是什么都行不通!
堆栈面板的可见性状态始终为可见!
我做错了什么?
解决方法
只需少量更改即可使您的代码工作。我使转换器成为页面资源:
<UserControl.Resources>
<local:RadioBtnState2Visible x:Key=\"Convert\" />
</UserControl.Resources>
我还应该提到,我还必须在堆栈面板中实际放一些东西,以查看更改,因为默认情况下它不会崩溃:)我假设您实际上在真正的堆栈面板中有内容。
只是为了解释这里发生了什么。通过在资源声明中添加\“ local:\”,实际上是在封装资源实例,而不更改当前资源。 \“ Convert \”引用它不起作用,因为它无法在期望找到的位置找到资源。
, 这是Silverlight还是WPF?您可能需要为绑定指定模式。模式=单向应该工作。
, 实际上,RadioButon.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,System.Globalization.CultureInfo culture )
{
return value == Visibility.Visible ; // yup,it\'s a boolean
}
}
它应该工作得更好。