WPF按钮调用StackPanel visibilityconverter

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 
    } 
}