WPF按钮调用StackPanel visibilityconverter
问题描述:
我的任务是当用户单击按钮时,由于该按钮的值,此StackPanel可以具有特殊功能,因此更改StackPanel的可见性。出于这个原因,我实现了VisibilityConverter,当StackPanelVis为真时,它应该改变可视性。代码转换器:WPF按钮调用StackPanel visibilityconverter
public class StakPanelToVisible : IValueConverter
{
public static bool StackPanelVis;
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
value = StackPanelVis;
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(...) {empty}
当用户按在原因命令,在VM传递值StackPanelToVisible代码指令的按钮:
public RelayCommand SetAddingButton
{
get
{
return new RelayCommand(SetAddingProperties, true);
}
}
public bool StackPanelVis { get; private set; }
private void SetAddingProperties()
{
TextInducator = "Add";
StakPanelToVisible.StackPanelVis = true;
}
代码视图XAML:
<StackPanel Margin="5 10 5 0" Grid.Column="1" >
<StackPanel Visibility="{Binding StackPanelVis, Converter=
{StaticResource StakPanelToVisible}}" >
some elements in StackPanel
<Button Content="Add" Margin="5 5 5 1"
Padding="2" x:Name="AddPosition_button"
Command="{Binding SetAddingButton }"/>
最后一个按钮应该改变StackPanel的可见性。但是,此代码不起作用。为什么它不起作用?任何其他版本可以帮助我?感谢任何帮助,文章或替代解决方案的任务。
答
您的虚拟机中有StackPanelVis属性,但更改了转换器中的静态字段。
首先你需要将它从转换器中删除。
public class StakPanelToVisible : IValueConverter
{
// public static bool StackPanelVis; // remove this one
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
// value = StackPanelVis; // and this one
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(...) {empty}
}
其次,更改命令实现以更改VM中的属性。
private void SetAddingProperties()
{
TextInducator = "Add";
StackPanelVis = true;
}
第三,在你StackPanelVis调用OnPropertyChanged( “StackPanelVis”):
private bool _stackPanelVis;
public bool StackPanelVis
{
get { return _stackPanelVis; }
set {
if (value == _stackPanelVis) return;
_stackPanelVis = value;
OnProperyChanged("StackPanelVis");
}
}
你的虚拟机必须实现INotifyPropertyChanged接口。
此外,您还可以使用内置的BooleanToVisibilityConverter
答
你的转换器应该是这样的:
class BooleanToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is Boolean && (bool)value)
{
return Visibility.Visible;
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is Visibility && (Visibility)value == Visibility.Visible)
{
return true;
}
return false;
}
}
,应引用无论是在你的App.xaml中或在文件中要使用它(下面是App.xaml中实现)
<ResourceDictionary>
<local:BooleanToVisibilityConverter x:Key="StakPanelToVisible" />
</ResourceDictionary>
而且你StackPanelVis属性应实行以让查看KN INotifyPropertyChanged接口(它应该看起来更像是这样):
private bool isStackPanelVisible;
public bool IsStackPanelViesible
{
get { return isStackPanelVisible; }
set
{
isStackPanelVisible = value;
//RaisePropertyChanged from your implementation of INotifyPropertyChanged
}
}