2017-10-08 91 views
0

我的任務是當用戶單擊按鈕時,由於該按鈕的值,此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的可見性。但是,此代碼不起作用。爲什麼它不起作用?任何其他版本可以幫助我?感謝任何幫助,文章或替代解決方案的任務。

回答

1

您的虛擬機中有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

0

你的轉換器應該是這樣的:

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